【参考文章】: Dockerfile 菜鸟教程
【参考文章】: 你必须知道的Dockerfile
【参考文章】: Dockerfile: ENTRYPOINT和CMD的区别
【参考文章】: Dockerfile 中的COPY 和 ADD 命令
1. 简介
Dockerfile 是一个用来构建镜像的文本文件,里面包含了构建镜像的所有的指令;
在执行 docker build 命令时,就会按照 Dockerfile 中定义的指令顺序执行指令;
2. 基本构成
- 基础镜像:制作镜像一般都是在某个镜像的基础上进行操作;
- 构建命令:这部分就是 Dockerfile 的主要内容,包含了构建镜像的命令过程;
- 启动命令:这部分是容器启动时需要执行的命令,一般容器启动成功后要执行自己服务的启动脚本,让服务运行起来;
3. 基本命令
3.1 FROM
设置基础镜像信息,后面都是基于基础镜像进行操作
FROM centos:7 设置centos7为基础镜像
3.2 MAINTAINER
设置维护者的信息,一般设置名字和邮箱地址
MAINTAINER virgosnail virgosnail@qq.com
3.3 WORKDIR
相当于Linux的 cd 命令
WORKDIR /home 进入 home 目录
3.4 USER
设置执行命令的用户
USER root 以 root 用户执行命令
3.5 RUN
执行后面跟着的命令
RUN rm -rf ./* 删除当前目录下的所有文件
3.6 COPY
将指定的文件、文件夹拷贝到镜像中;
拷贝目录时只拷贝目录下的内容,不会拷贝该目录;
文件名信息支持 go 风格的通配符;
COPY a.txt /home
3.7 ADD
将指定的文件、文件夹拷贝到镜像中;
拷贝目录时只拷贝目录下的内容,不会拷贝该目录;
如果是压缩文件,则自动解压;
支持从 URL 地址拷贝文件到镜像文件,不推荐,此时会创建更多的镜像层;
ADD a.txt /home 将宿主机的 a.txt 文件拷贝到镜像文件的 /home 目录下
3.8 VOLUME
设置数据卷,挂载主机目录
3.9 EXPOSE
容器运行的服务端口信息,多个端口则用空格隔开;
当用 docker run 启动时,
如果用 p (小写)设置端口映射时,此时 EXPOSE 命令不生效;
当使用 P (大写)时,则使用随机端口映射到 EXPOSE 的端口;
EXPOSE 21010 21011
3.10 CMD
设置容器启动后要执行的命令,一般为服务的启动脚本;
存在多个 CMD 命令时,只有最后一个会生效;
如果使用 docker run 命令启动容器时指定了容器启动后执行的命令,则会覆盖 dockerfile 中的 CMD 命令;
CMD 有两种写法:
shell:CMD command param1 param2
exec:CMD ["command","param1","param2"] 推荐使用
3.11 ENTRYPOINT
存在多个 ENTRYPOINT 命令时,只有最后一个会生效;
使用 docker run 命令启动容器时可以通过 --entrypoint command 覆盖 dockerfile 中的 ENTRYPOINT 命令;
ENTRYPOINT 有两种写法:
shell:ENTRYPOINT command param1 param2
exec:ENTRYPOINT ["command","param1","param2"] 推荐使用
3.11 ENTRYPOINT 和 CMD 组合使用
当同时存在 ENTRYPOINT 和 CMD 时,docker 会将 CMD 的参数拼接到 ENTRYPOINT 后面再执行命令;
ENTRYPOINT 为默认的运行命令,CMD 为默认的运行是参数;
3.11 SHELL 和 EXEC
当使用shell表示法时, 命令行程序作为sh程序的子程序运行, docker用/bin/sh -c的语法调用. 如果我们用docker ps命令查看运行的docker, 就可以看出实际运行的是/bin/sh -c命令;
PID为1的进程并不是在Dockerfile里面定义的命令, 而是/bin/sh命令. 如果从外部发送任何POSIX信号到docker容器, 由于/bin/sh命令不会转发消息给实际运行的命令, 则不能安全得关闭docker容器;
EXEC 则没有这种弊端;
4. 示例
FROM centos:7
MAINTAINER virgosnail virgosnail@qq.com
ADD start.sh /home/bin
RUN chmod +x /home/bin/start.sh
CMD /home/bin/start.sh