首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于 Dockerfile 指令 详解

CMD

CMD 指令用于指定一个容器启动时要运行的命令,跟 RUN 有点类似,只是 RUN 指令是指镜像被构建时要运行的命令。而 CMD 是指定容器被启动时要运行的命令,和 docker run 命令启动容器时指定要运行的命令非常类似。

指定要运行的特定命令

这两个命令是等效的

使用 CMD 指令

给 CMD 指令传递参数

这里我们将 -l 标志传递给了 /bin/bash 命令

docker run 命令可以覆盖 CMD 指令,如果我们在 Dockerfile 里制定了 CMD 指令,而同时在 docker run 命令行中也指定了要运行的命令,命令行中指定的命令会覆盖 Dockerfile 中的 CMD 指令

覆盖 Dockerfile 文件中的 CMD 指令

用 CMD 指令启动容器

覆盖本地命令

ENTRYPOINT

ENTRYPOINT 跟 CMD 指令是类似的,但 ENTRYPOINT 指令提供的命令则不容易在启动容器时被覆盖

指定 ENTRYPOINT 指定

为 ENTRYPOINT 指令指定参数

WORKDIR

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

使用 WORKDIR 指令

这里,我们将工作目录切换为 /opt/webapp/db 后运行了 bundle install 命令。之后又将工作目录设置为 /opt/webapp,最后设置了 ENTRYPOINT 指令来启动 rakcup 命令。

可以通过 -w 标志在运行时覆盖工作目录,如下 :

该命令会将容器内的工作目录设置为 /var/log

ENV

ENV 指令用来在镜像构建过程中设置环境变量。如下:

这个新的环境变量可以在后续的任何 RUN 指令中使用,这就如同在命令前面制定了环境变量前缀一样,如下:

添加 ENV 前缀后执行

使用 ENV 设置多个环境变量

在其他 Dockerfile 指令中使用环境变量

在这里我们设定了一个新的环境变量 TARGET_DIR ,并在 WORKDIR 中使用了他的值。因此实际上 WORKDIR 指令的值会被设为 /opt/app。

这些环境变量也会被持久保存到从我们的镜像创建的任何容器中,所以,如果我们在使用 ENV AKA_PATH /home/aka/ 指令构建的容器中运行 env 命令,将会看到如下所示:

Docker 容器中环境变量的持久化

也可以使用 docker run 命令行的 -e 标志来传递环境变量,这些变量将只会在运行时有效,如下所示:

运行时的环境变量

可以看到在容器中的 WEB_PORT 环境变量被设为了 8080

USER

USER 指令用来指定该镜像会以什么样的用户去运行,可以和 GROUP 指令配合使用

我们可以指定用户名或者 UID 以及组或 GID ,甚至是两者的组合,如下所示

也可以在 docker run 命令中通过 -u 标志来覆盖该指令指定的值。

如果不通过 USER 指令指定用户,默认用户为 root

VOLUME

VOLUME 指令用来向基于镜像创建的容器添加卷,类似文件夹或者盘符

卷可以在容器间共享和重用

一个容器可以不是必须和其他容器共享卷

对卷的修改是立即生效的

对卷的修改不会对更新镜像产生影响

卷会一直存在直到没有任何容器再使用它

使用 VOLUME 指令以及使用 VOLUME 指令指定多个卷

docker cp 是和 VOLUME 指令相关并且也是很实用的命令。该命令允许从容器复制文件和复制文件到容器上。

ADD

ADD 指令用来将构建环境下的文件和目录复制到镜像中,比如,在安装一个应用程序时,ADD 指令需要源文件的文职和目的文件位置两个参数,如下所示

上面那行命令,会将构建目录下的 software.lic 文件复制到镜像中的 /opt/application/software.lic

在 ADD 文件时,Docker 通过目的地址参数末尾的字符来判断文件是目录还是文件,如果以 / 结尾,那么 Docker 就认为是目录,反之为文件。

在 ADD 指令中使用 URL 作为文件源

将归档文件作为 ADD 指令中的源文件

ADD 在处理本地归档文件时,会自动将其解开。

如果目标路径不存在的话,Docker 会自动为我们创建这个全路径。

COPY

这条指令将会把本地 conf.d 目录中的文件复制到 /etc/apache2 目录中。

如果目的位置不存在,Docker 将会自动创建所有需要的目录结构。

LABEL

LABEL 指令用于为 Docker 镜像添加一些标签,以键值对的形式展现。

添加 LABEL 指令

可以通过 docekr inspect 命令来查看容器标签

ARG

ARG 指令用来定义可以在 docker build 命令运行时传递给构建运行时的变量,我们只需要在构建时使用 --build-arg 标志即可,用户只能在构建时指定在 Docekrfile 文件中定义过的参数

添加 ARG 指令

上面例子中第二条 ARG 指令设置了一个默认值,如果构建时没有为该参数指定值,就会使用此默认值。

使用 ARG 指令

这里构建 akaImage/nginx 时,build变量将会设置为 1234 ,而 webapp_user 变量则会继承设置的默认值 user。

Docker 预定义了一组 ARG 变量,可以在构建时使用,而不必在 Docekrfile 中自行定义

预定义 ARG 变量

要想使用这些预定义的变量,只需要给 docker build 命令传递 --build-arg = 标志就可以了

ONBUILD

该指令会为镜像添加触发器

添加 ONBUILD 指令

可以通过 docker inspect 命令查看镜像中的 ONBUILD 指令

新的 ONBUILD 镜像的 Dockerfile

构建 apache2 镜像

webapp 的 Dockerfile

构建 webapp 镜像

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G1I90800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券