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
2
3
4
# 制作基准镜像
FROM 镜像
# 比如我们要发布一个应用到tomcat里,那么的第一步就是FROM tomcat
FROM tomcat<:tags>

LABEL & MAINTAINER

1
2
3
4
5
6
7
# MAINTAINER,一般写个人id或组织id
# LABEL 就是注释,方便阅读的,纯注释说明。不会对Dockerfile造成任何影响
# 比如:
MAINTAINER baidu.com
LABEL version = "1.0.0"
LABEL description = "我们是大百度!"
# ...等等描述性信息,纯注释。

WORKDIR

1
2
3
# 类似于Linux中的cd命令,但是他比cd高级的地方在于,我先cd,发现没有这个目录,我就自动创建出来,然后在cd进去
# 这个路径建议使用绝对路径。
WORKDIR /usr/local/testdir

COPY & ADD

COPY

1
2
3
4
5
6
# 将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下:
COPY 1.txt /
# 拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/
# ? 是单个字符的占位符,比如匹配文件 abc1.log
COPY abc?.log /testdir/

ADD

1
2
3
4
# 将1.txt拷贝到根目录的abc目录下。若/abc不存在,则会自动创建
ADD 1.txt /abc
# 将test.tar.gz解压缩然后将解压缩的内容拷贝到/home/work/test
ADD test.tar.gz /home/work/test

docker官方建议当要从远程复制文件时,尽量用curl/wget命令来代替ADD。因为用ADD的时候会创建更多的镜像层。镜像层的size也大。

对比

  • 二者都是只复制目录中的文件,而不包含目录本身。
  • COPY能干的事ADD都能干,甚至还有附加功能。
  • ADD可以支持拷贝的时候顺带解压缩文件,以及添加远程文件(不在本宿主机上的文件)。
  • 只是文件拷贝的话可以用COPY,有额外操作可以用ADD代替。

ENV

1
2
3
4
# 设置环境常量,方便下文引用,比如:
ENV JAVA_HOME /usr/local/jdk1.8
# 引用上面的常量,下面的RUN指令可以先不管啥意思,目的是想说明下文可以通过${xxx}的方式引用
RUN ${JAVA_HOME}/bin/java -jar xxx.jar

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"]