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 镜像构建效率更高、减小其大小、使其更灵活且可重用。