CMD
CMD命令用于指定一个容器启动时要运行的命令,和RUN指令有点类似。
不过RUM命令是指镜像被构建时要运行的指令,而CMD是指容器被启动时要运行的命令。
这和docker run命令启动的时候指定的运行命令非常类似,并且docker run命令启动时指定的运行命令会覆盖CMD命令。
例如Dockerfile中的如下CMD命令:
如果以下面的方式运行容器:
则会覆盖CMD中的命令。
ENTRYPOINT
ENTRYPOINT指令与CMD指令类似,也容易和CMD命令混淆。ENTRYPOINT命令不容易在启动容器时被覆盖,而是将docker run命令中指定的任何参数当做参数再次传递给ENTRYPOINT指令中的命令。
例如:
相当于运行:
我们也可以组合使用ENTRYPOINT和CMD命令来完成一些巧妙的工作。
我们启动一个容器的时候不指定任何参数,则-h会被传递给ENTRYPORINT命令
WORKDIR
WORKDIR指令用来创建一个新容器的时候,在容器内部设置一个工作目录。
ENTRYPOINT和/或者CMD指定的程序都会在这个目录下执行。
这里我们将工作目录切换到/opt/webapp/db后运行bunle install命令,之后又将工作目录设置为/opt/webapp,最后启动ENTRYPORINT中指定的rackup命令。
ENV
ENV用来在构建镜像的时候设置环境变量,当然这些环境变量在docker run的时候可以用-e 参数来修改。
USER
指定该镜像以什么样的UID或者GID去运行容器。
VOLUME
VOLUME用于向基于镜像创建的容器中添加卷,可以简单的理解为linux中的数据盘挂载,只是这里添加的是一个宿主机目录。
用于对容器中的数据进行持久化。
- 卷可以在容器间共享和重用
- 对卷的修改是立时生效的
- 删除容器时,容器中的数据不会丢失,但是删除镜像时,容器的数据会被一起删除。这个时候VOLUME添加的卷会保留。
ADD
ADD指令将构建环境下的文件和目录复制到镜像中。1ADD software.lic /opt/application/software.lic
不能对构建目录之外的文件进行ADD操作。另外ADD处理本地归档文件(tar, zip)的时候,如果归档文件ADD到一个目录,docker会自动解压。
COPY
COPY非常类似ADD命令,他们的根本不同是COPY指关心在够将上下文中复制本地文件,而不会做文件提取和解压。同样不能copy构建目录之外的任何文件。