开始学习制作docker镜像
准备工作:安装docker(百度很多教程,没啥好说,不废话),然后将附件里的压缩包解压缩到任意目录,在命令行中进入该目录下。
- 编制制作脚本文件duoBuild.dockfile。
这里我已经制作好了,实际上脚本也没什么复杂的东西。简单来说,也就是FROM命令指定镜像的基础包。ENV命令设置镜像的环境变量。WORKDIR命令设置进入容器的默认路径(本镜像默认把源码挂载在/mnt目录,所以工作区也设置为该路径)。COPY命令将主机目录的内容复制到镜像内。RUN命令会在构建镜像时进入镜像环境中执行相关的Linux指令(比方说给镜像安装指定的软件包,文件的处理等)。
我们看一下本次制作duo_env的脚本文件。文件开头可以看到以下内容(均有注释,就不一一解释了):
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive TZ=Asia/Shanghai
WORKDIR /mnt
COPY vuser/* /root/
RUN groupadd -g 1000 tina && \
useradd vuser -r -m --uid 1000 -g tina --shell /bin/bash && \
mv /root/powerline-go /usr/bin/powerline-go && chmod 755 /usr/bin/powerline-go && \
mkdir ~/.pip && \
echo '[global]' >> ~/.pip/pip.conf && \
echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf && \
echo '[install]' >> ~/.pip/pip.conf && \
echo 'trusted-host = https://pypi.tuna.tsinghua.edu.cn' >> ~/.pip/pip.conf && \
cp -rv ~/.pip /home/vuser/ && chown -R vuser:tina /home/vuser/.pip && \
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
apt-get update && apt install pkg-config build-essential ninja-build automake \
autoconf libtool wget curl git gcc libssl-dev bc slib squashfs-tools \
android-sdk-libsparse-utils jq python3-distutils scons parallel tree \
python3-dev python3-pip device-tree-compiler ssh cpio fakeroot libncurses5 \
flex bison libncurses5-dev genext2fs rsync unzip dosfstools mtools tcl \
openssh-client cmake -y && \
wget http://security.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb && \
dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb && \
rm libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb && \
apt-get clean && \
cd /root && cp .bashrc .bash_aliases /home/vuser/ && chown -R vuser:tina /home/vuser
CMD ["/bin/bash"]
- 创建docker镜像
在磁盘的任意位置创建一个任意目录(比如docker_build), 然后把附件的压缩包解压缩到这个目录里,然后用命令行进入这个目录(docker_build)。在命令行中执行以下命令(需要将walker2048替换成你自己的dockerhub用户名):
sudo docker build -t walker2048/duo_env -f duoBuild.dockerfile --network host .
命令解析:
build参数:告诉docker要执行创建镜像的工作
-t walker2048/duo_env 参数: 告诉docker这个镜像的tag(walker2048/tina_env)。可以理解成镜像的标识符(类似地址和姓名),这个tag标签是可以修改的,把镜像上传到dockerhub上也需要指定正确的标签。
-f Docker/tina_env.dockerfile 参数: 告诉docker使用哪一个构建脚本(可以使用绝对路径和相对路径)
--network host参数: 告诉docker使用主机的网络配置
最后的. 参数:将当前目录的所有内容传递给docker作为临时输入内容(COPY命令需要使用)。
- 创建docker容器
创建容器前,需要先理解一下创建容器的一些基础知识。
3.1 容器类似独立的虚拟机,除了挂载上去的目录,文件系统和寄主机是不相通的。
3.2 可以创建名称不同的、但是使用的镜像相同的容器。容器间是独立的关系。
3.3 容器网络使用方式需要指定,一般编译服务器无特殊要求的,可以直接指定使用host网络。
3.4 如果是Linux系统,想让docker容器访问USB设备,可以使用--privileged参数开启。
3.5 创建容器(虚拟机)后,下次使用不需要重新创建。
Linux或者Bash环境使用以下命令
docker run -it --name duo_build \
--net=host \
--privileged \
-u vuser \
-v $(pwd):/mnt \
-v /dev:/dev \
-w /mnt \
walker2048/duo_env
Windows环境使用以下命令
`docker run --name duo -it -u vuser -v /dev:/dev --network host --privileged -v $(pwd):/mnt/duo -w /mnt walker2048/duo_env`
参数解析:
run 参数: 告诉docker需要创建容器
-it 参数: 创建完毕后自动运行容器时,使用命令行交互方式运行(开启这个参数才能使用命令行交互)
--name tina_build 参数: 告诉docker把这个容器命名为tina_build(后期运行容器需要使用这个)
--net=host 参数:指定容器的网络模式为host模式(和主机同一个网络)
--privileged 参数:特权模式,Linux环境下才有用,开启后可以访问USB设备
-v $(pwd):/mnt 参数:挂载当前目录到容器的/mnt目录(都需要使用绝对路径,文件双方共享,可读写)
walker2048/duo_env 参数: 告诉docker使用哪个镜像来创建容器。
4、进入容器后,直接运行./build_milkv.sh就会开始编译SDK了。
首次编译时会自动下载工具链。
5、镜像已上传到dockerhub,使用以下命令可以直接拉取
docker pull walker2048/duo_env
|