前言
说到 Docker 容器,就不得不提一个非常重要的文件 Dockerfile,它是用于定义镜像构建过程的配置文件。在 Dockerfile 文件中,包含了镜像构建过程中需要执行的命令已经相关的操作。Dockerfile 文件在不同的环境下执行就会生成对应环境的镜像服务,从而能够快速的实现容器迁移和集群部署。也正因为如此,Docker 容器能够跨平台部署和运行。
正文
如果我们想要构建自己的服务镜像,可以通过两种方式,第一种是通过直接保存当前运行的容器,然后将生成的镜像文件重新命名,也就是通常使用的 docker tag
命令,最后再把重命名的镜像推到公有云仓库或者私有仓库。第二种就是利用本文介绍的 Dockerfile 文件,进行重新构建,再推到相应的仓库。
总体上来说,Dockerfile 理解为一个由上往下执行指令的脚本文件。构建镜像时,Docker 会逐行解析 Dockerfile 中的命令,通过观察构建日志,我们也可以知道 Dockerfile 文件所有命令的执行顺序是顺序执行的。
构建实例日志:
current os:Linux docker build -f Dockerfile.x86 -t registry.cn-beijing.aliyuncs.com/liuzhen007/bag-x86:1.6.6 . Sending build context to Docker daemon 337.4MB Step 1/15 : FROM registry.cn-beijing.aliyuncs.com/liuzhen007/base-x86-ffmpeg:1.0 ---> c91b1af20a82 Step 2/15 : USER root ---> 827d7a1d2e52 Step 3/15 : ENV TZ=Asia/Shanghai ---> b1d66c3f4cc8 Step 4/15 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ---> c21e6a502a33 Step 5/15 : WORKDIR /root/bag/ ---> c224c6317820 Step 6/15 : COPY ./bin/bag . ---> 59b4d013ce87 Step 7/15 : COPY ./bin/server.crt . ---> 36b92b7306f8 Step 8/15 : COPY ./bin/server.key . ---> 25da16fc2011 Step 9/15 : COPY ./config.example.yaml ./config.yaml ---> 44d1ae9f2686 Step 10/15 : RUN echo "/usr/local/lib/" >> /etc/ld.so.conf && ldconfig ---> Running in bb907e7a1eb7 Step 11/15 : RUN mkdir /var/www && mkdir /var/www/html && mkdir /var/www/html/user-media && mkdir /var/www/html/module ---> Running in 7e1da4234327 Removing intermediate container 7e1da4234327 ---> 4b4ca4e832f2 Step 12/15 : COPY ./data /var/www/html/user-media ---> 62a16954bafd Step 13/15 : COPY ./docker/module /var/www/html/module ---> bb4e96ffdc57 Step 14/15 : COPY ./docker/moviemasher ./ ---> 955a6248856e Step 15/15 : CMD ["./bag"] ---> 7af71e575223 Successfully built 7af71e575223 复制代码
命令分析
FROM
完全从0构建一个新镜像是不现实的,一般的做法都是先依赖一个基础镜像,再在这个基础镜像的基础上添加自己的需要的环境和代码程序。当声明基础镜像时,就需要用到 FROM 这个命令。
一般命令格式如下:
FROM image AS name
实例参考:
From golang:1.14.2-alpine3.11 AS test
RUN
在镜像构建过程中,我们可以执行相应的命令,一般命令格式如下:
RUN command
实例参考:
RUN go mod tidy
RUN go build main.go
COPY和ADD
在构建新的镜像的时候,我们可能需要将一些配置文件、程序代码或者执行脚本导入到镜像内的文件系统里,COPY 和 ADD 命令就是用来干这个的。
一般命令格式如下:
COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
ADD [--chown=:] ["<源路径1>",... "<目标路径>"]
实例参考:
COPY ./.netrc /app
COPY . /app/bag
CMD
基于镜像启动的容器,在容器启动时会根据镜像构建时指定的命令来启动一个进程。而这个命令的定义,就是通过 Dockerfile 中的 CMD 命令来实现的。
一般命令格式如下:
CMD ["<可执行文件或命令>","param1","param2",...]
实例参考:
CMD ["node", "bin/www"]
结尾
熟悉 Dockerfile 的命令是编写 Dockerfile 的前提,本文只介绍了几个最为常见的命令,感兴趣的小伙伴可以自己去深入了解一下。好了,今晚的内容就介绍这么多,晚安。我是 liuzhen007,欢迎关注,分享更多容器相关知识。
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云享专家(共创编辑)、InfoQ 签约作者,欢迎关注我分享更多干货!😄