Dockerfile详解
Dockerfile的常用命令如下,大家使用时也可以到官网查阅所有的命令,不用记忆:
命令 | 作用 |
---|---|
FROM image_name:tag | 使用哪个基础镜像启动构建流程,每个Dockerfile的第一条命令必须是FROM,FROM指令指定一个已存在的镜像,后续指令都继续该镜像进行,这个镜像也称为基础镜像 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录,指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 |
EXPOSE port1 prot2 | 用来指定端口,使容器内的应用可以通过端口和外界交互 |
CMD argument | 在构建容器时使用,会被docker run 后的argument覆盖 |
ENTRYPOINT argument | 和CMD相似,但是并不会被docker run指定的参数覆盖 |
VOLUME | 将本地文件夹或者其他容器的文件挂载到容器中 |
参考:https://mp.weixin.qq.com/s/0hePvXK8SgpThxQnvwXysQ
基础命令:
FROM
1 | 制作基准镜像 |
LABEL & MAINTAINER
1 | MAINTAINER,一般写个人id或组织id |
WORKDIR
1 | 类似于Linux中的cd命令,但是他比cd高级的地方在于,我先cd,发现没有这个目录,我就自动创建出来,然后在cd进去 |
COPY & ADD
COPY
1 | 将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下: |
ADD
1 | 将1.txt拷贝到根目录的abc目录下。若/abc不存在,则会自动创建 |
docker官方建议当要从远程复制文件时,尽量用curl/wget命令来代替ADD。因为用ADD的时候会创建更多的镜像层。镜像层的size也大。
对比
- 二者都是只复制目录中的文件,而不包含目录本身。
- COPY能干的事ADD都能干,甚至还有附加功能。
- ADD可以支持拷贝的时候顺带解压缩文件,以及添加远程文件(不在本宿主机上的文件)。
- 只是文件拷贝的话可以用COPY,有额外操作可以用ADD代替。
ENV
1 | 设置环境常量,方便下文引用,比如: |
ENV设置的常量,其他地方都可以用${xxx}来引用,将来改的时候只改ENV的变量内容就行。
运行指令:
RUN
执行时机
RUN指令是在构建镜像时运行,在构建时能修改镜像内部的文件。
命令格式
命令格式不光是RUN独有,而是下面的CMD和ENTRYPOINT都通用。
- SHELL命令格式:
- 比如:
RUN yum -y install vim
- 比如:
- EXEC命令格式:
- 比如:
RUN ["yum","-y","install","vim"]
- 比如:
- 二者对比
- SHELL:当前shell是父进程,生成一个子shell进程去执行脚本,脚本执行完后退出子shell进程,回到当前父shell进程。
- EXEC:用EXEC进程替换当前进程,并且保持PID不变,执行完毕后直接退出,不会退回原来的进程。
- 总结:也就是说shell会创建子进程执行,EXEC不会创建子进程。
- 推荐EXEC命令格式
举例
举个最简单的例子,构建镜像时输出一句话,那么在Dockerfile里写如下即可:
1 | RUN ["echo", "image is building!!!"] |
再比如我们要下载vim,那么在Dockerfile里写如下即可:
1 | RUN ["yum","-y","install","vim"] |
CMD
执行时机
容器启动时执行,而不是镜像构建时执行。
解释说明
在容器启动的时候执行此命令,且Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。重点在于如果容器启动的时候有其他额外的附加指令,则CMD指令不生效。
举例
1 | CMD ["echo", "container starting..."] |
ENTRYPOINT
执行时机
容器创建时执行,而不是镜像构建时执行。
解释说明
在容器启动的时候执行此命令,且Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。
举例
1 | ENTRYPOINT ["ps","-ef"] |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LXY's blog!