uncategorized

Dockerfile命令

CMD

CMD命令用于指定一个容器启动时要运行的命令,和RUN指令有点类似。
不过RUM命令是指镜像被构建时要运行的指令,而CMD是指容器被启动时要运行的命令。
这和docker run命令启动的时候指定的运行命令非常类似,并且docker run命令启动时指定的运行命令会覆盖CMD命令。
例如Dockerfile中的如下CMD命令:

1
CMD ["/bin/bash"]

如果以下面的方式运行容器:

1
$ docker run -i -t ubuntu /bin/ps

则会覆盖CMD中的命令。

ENTRYPOINT

ENTRYPOINT指令与CMD指令类似,也容易和CMD命令混淆。ENTRYPOINT命令不容易在启动容器时被覆盖,而是将docker run命令中指定的任何参数当做参数再次传递给ENTRYPOINT指令中的命令。
例如:

1
2
3
4
ENTRYPOINT ["/usr/sbin/nginx"]
...
$ docker run -i -t ubuntu_nginx -g "daemon off;"

相当于运行:

1
root@e643e6218589:# /usr/sbin/nginx -g "daemon off"

我们也可以组合使用ENTRYPOINT和CMD命令来完成一些巧妙的工作。

1
2
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]

我们启动一个容器的时候不指定任何参数,则-h会被传递给ENTRYPORINT命令

1
root@e643e6218589:# /usr/sbin/nginx -h

WORKDIR

WORKDIR指令用来创建一个新容器的时候,在容器内部设置一个工作目录。
ENTRYPOINT和/或者CMD指定的程序都会在这个目录下执行。

1
2
3
4
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["rackup"]

这里我们将工作目录切换到/opt/webapp/db后运行bunle install命令,之后又将工作目录设置为/opt/webapp,最后启动ENTRYPORINT中指定的rackup命令。

ENV

ENV用来在构建镜像的时候设置环境变量,当然这些环境变量在docker run的时候可以用-e 参数来修改。

USER

指定该镜像以什么样的UID或者GID去运行容器。

VOLUME

VOLUME用于向基于镜像创建的容器中添加卷,可以简单的理解为linux中的数据盘挂载,只是这里添加的是一个宿主机目录。
用于对容器中的数据进行持久化。

  1. 卷可以在容器间共享和重用
  2. 对卷的修改是立时生效的
  3. 删除容器时,容器中的数据不会丢失,但是删除镜像时,容器的数据会被一起删除。这个时候VOLUME添加的卷会保留。

    ADD

    ADD指令将构建环境下的文件和目录复制到镜像中。
    1
    ADD software.lic /opt/application/software.lic

不能对构建目录之外的文件进行ADD操作。另外ADD处理本地归档文件(tar, zip)的时候,如果归档文件ADD到一个目录,docker会自动解压。

1
ADD lastest.tar.gz /var/www/wordpress

COPY

COPY非常类似ADD命令,他们的根本不同是COPY指关心在够将上下文中复制本地文件,而不会做文件提取和解压。同样不能copy构建目录之外的任何文件。