Dockerfile 中的重要指令


我们都知道 Dockerfile 在创建高效且灵活的 Docker 镜像中的重要性。Dockerfile 包含一组指令,当您使用 docker build 命令构建 Docker 镜像时,这些指令会按步骤执行。它包含某些决定镜像结构的指令和命令、构建镜像所需的时间、与 Docker 构建上下文相关的指令、与容器中要安装的软件包和库相关的信息等等。因此,创建高效、可重用、简洁的 Dockerfile 非常重要,因为它包含您将构建的镜像的蓝图。

在本文中,我创建了一个精心策划的列表,其中包含 Dockerfile 中广泛使用的所有重要命令和指令。在另一篇文章中,我还列出了创建 Dockerfile 的最佳实践。

https://tutorialspoint.com/best-practices-for-writing-a-dockerfile 

事不宜迟,让我们讨论一些您应该彻底了解的最重要的 Dockerfile 命令,以便高效地创建 Dockerfile。

FROM

您可能已经注意到,几乎所有 Dockerfile 都以 FROM 命令开头。FROM 命令的形式为:

FROM <image name>:<tag name>

FROM 命令允许您创建一个基础镜像,例如操作系统、编程语言等。在此命令之后执行的所有指令都发生在此基础镜像上。它包含一个镜像名称和一个可选的标签名称。如果您之前已将基础镜像拉取到本地机器,则它不会再拉取新的。Docker 仓库中提供了多个预发布的 Docker 基础镜像。您也可以将您自己的自定义基础镜像推送到 Docker 仓库中。

以下是使用不同基础镜像的 FROM 指令示例:

FROM ubuntu
FROM centos
FROM python:3

RUN

RUN 指令用于运行指定的命令。您可以使用多个 RUN 指令来运行不同的命令。但将所有 RUN 指令组合成一个指令是一种有效的方法。

每个 RUN 命令都会创建一个新的缓存层或中间镜像层,因此将它们全部链接到一行会提高效率。但是,链接多个 RUN 指令也可能导致缓存失效。

以下是 RUN 命令的一些示例:

RUN apt−get −y install vim
RUN apt−get −y update

您可以通过以下方式链接多个 RUN 指令:

RUN apt−get −y update \
&& apt−get −y install firefox \
&& apt−get −y install vim

CMD

如果您想通过指定一个默认命令来运行 Docker 容器,该命令默认情况下会为该镜像的所有容器执行,则可以使用 CMD 命令。如果您在 docker run 命令期间指定了命令,则它会覆盖默认命令。指定多个 CMD 指令,只会执行最后一个。

CMD 命令示例:

CMD echo "Welcome to TutorialsPoint"

如果您在 Dockerfile 中指定上述行,并使用以下命令运行容器而无需指定任何参数,则输出将为“欢迎来到 TutorialsPoint”。

sudo docker run −it <image_name>

输出:“欢迎来到 TutorialsPoint”

如果您尝试指定任何其他参数(例如 /bin/bash 等),则默认 CMD 命令将被覆盖。

ENTRYPOINT

ENTRYPOINT 和 CMD 之间的区别在于,如果您尝试在 docker run 命令中指定默认参数,它不会忽略 ENTRYPOINT 参数。ENTRYPOINT 命令的 exec 形式为:

ENTRYPOINT [“<可执行命令>”, “<参数 1>”, “<参数 2>”, …]

如果您使用了 ENTRYPOINT 指令的 exec 形式,则还可以借助 CMD 命令设置其他参数。例如:

ENTRYPOINT ["/bin/echo", "Welcome to TutorialsPoint"]
CMD ["Hello World!"]

在不带任何参数的情况下运行 docker run 命令将输出:

欢迎来到 TutorialsPoint Hello World!

如果您指定任何其他 CLI 参数,“Hello World!” 将被覆盖。

WORKDIR

您可以使用 WORKDIR 指令在容器内指定您的工作目录。Dockerfile 中之后的任何其他指令都将仅在此特定工作目录上执行。

例如,

WORKDIR /usr/src/app

将容器内的工作目录设置为 /usr/src/app。

COPY

此指令允许您将目录从本地机器复制到 Docker 容器。

例如,

FROM ubuntu
WORKDIR /usr/src/app
COPY ∽/Desktop/myapp .

这会将本地机器中 ∽/Desktop/myapp 目录内的所有文件复制到 Docker 容器内的当前工作目录。

ADD

与 COPY 指令类似,您可以使用 ADD 将文件和文件夹从本地机器复制到 Docker 容器。但是,ADD 还允许您从 URL 以及 tar 文件复制文件。

例如,

ADD ∽/Desktop/myapp/practice.tar.gz /usr/src/app

会将 tar 文件内的所有内容复制到容器内的 /usr/src/app。

ADD <URL such as a github url> <Destination path inside the container>

此命令会将 github url 内的所有文件复制到目标位置。

EXPOSE

Dockerfile 中的 EXPOSE 指令通知容器正在网络上的指定端口侦听。默认协议为 TCP。

示例

EXPOSE 8080

会将 8080 端口映射到容器。

您可以将 -p 标志与 docker run 命令一起使用,以使容器侦听另一个容器或主机机器。

LABEL

您可以使用 LABEL 指令为 Docker 镜像添加描述或元数据。它是一个键值对。

示例:

LABEL description="This is a sample image"

总之,这些是在 Dockerfile 中最常用的一些基本且重要的指令,并且以正确的方式使用它们肯定会使您的 Docker 镜像构建效率更高、减小其大小、使其更灵活且可重用。

更新于:2020 年 10 月 27 日

2K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告