网站建设的技术难点,链接网站logo,seo网站推广培训,门户 diy WordPress这些建议旨在帮助您创建一个高效且可维护的Dockerfile。
一、FROM
尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像#xff0c;因为它受到严格控制#xff0c;体积小#xff08;目前不到6 MB#xff09;#xff0c;同时仍然是一个完整的Linux发行版。 FR…
这些建议旨在帮助您创建一个高效且可维护的Dockerfile。
一、FROM
尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像因为它受到严格控制体积小目前不到6 MB同时仍然是一个完整的Linux发行版。 FROM [--platformplatform] image [AS name]
or
FROM [--platformplatform] image[:tag] [AS name]
or
FROM [--platformplatform] image[digest] [AS name]
FROM指令初始化新的构建阶段并为后续指令设置基本镜像。因此有效的Dockerfile必须以FROM指令开头。
镜像可以是任何有效的镜像——从公共存储库中提取镜像尤其容易
ARG是Dockerfile中FROM之前的唯一指令FROM可以在单个Dockerfile中多次出现以创建多个镜像或者将一个构建阶段用作另一个的依赖项。只需在每条新的FROM指令之前记下提交输出的最后一个镜像ID即可。每个FROM指令都会清除先前指令创建的任何状态。可选地可以通过将AS名称添加到FROM指令来为新的构建阶段指定名称。该名称可以在随后的FROM和COPY-FROMname指令中使用以引用在此阶段构建的镜像。标记值或摘要值是可选的。如果省略其中任何一个则默认情况下构建器将采用最新的标记。如果生成器找不到标记值则返回一个错误。
可选的--platform标志可用于在FROM引用多平台映像的情况下指定镜像的平台。例如linux/amd64、linux/arm64或windows/amd64。默认情况下将使用构建请求的目标平台。全局构建参数可以用于此标志的值例如自动平台ARG允许您将阶段强制到本机构建平台--platform$BUILDPORM并使用它交叉编译到阶段内的目标平台。
二、LABEL
您可以在镜像中添加标签以帮助按项目组织镜像、记录许可信息、帮助实现自动化或出于其他原因。对于每个标签添加一行以label开头包含一个或多个键值对。以下示例显示了不同的可接受格式。解释性意见包括在内。 带空格的字符串必须加引号或转义空格。还必须转义内部引号字符“。例如
# Set one or more individual labels
LABEL com.example.version0.0.1-beta
LABEL vendor1ACME Incorporated
LABEL vendor2ZENITH\ Incorporated
LABEL com.example.release-date2015-02-12
LABEL com.example.version.is-production
一个镜像可以有多个标签。在Docker 1.10之前建议将所有标签合并为一个LABEL指令以防止创建额外的层。这不再是必要的但仍然支持组合标签。例如
# Set multiple labels on one line
LABEL com.example.version0.0.1-beta com.example.release-date2015-02-12
上面的例子也可以写成
# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendorACME\ Incorporated \com.example.is-beta \com.example.is-production \com.example.version0.0.1-beta \com.example.release-date2015-02-12
三、RUN
将长的或复杂的RUN语句拆分到多行用反斜杠分隔使Dockerfile更具可读性、可理解性和可维护性。
1、apt-get
RUN最常见的用例可能是apt-get的应用程序。因为它安装了软件包RUN-apt-get命令有几个反直觉的行为需要注意。 总是在同一个RUN语句中结合RUN apt-get-update和apt-get-install。例如
RUN apt-get update apt-get install -y \package-bar \package-baz \package-foo \ rm -rf /var/lib/apt/lists/*
在RUN语句中单独使用apt-get-update会导致缓存问题和随后的apt-get-install指令失败。例如此问题将出现在以下Dockerfile中
# syntaxdocker/dockerfile:1FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y curl
构建镜像后所有层都在Docker缓存中。假设您稍后通过添加一个额外的包来修改apt-get-install如以下Dockerfile所示
# syntaxdocker/dockerfile:1FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y curl nginx
Docker认为初始指令和修改后的指令是相同的并重用前面步骤中的缓存。因此由于构建使用了缓存版本所以不会执行apt-get更新。因为apt-get更新没有运行所以您的构建可能会得到curl和nginx包的过时版本。 使用RUN apt-get-updateapt-get-install-y确保您的Dockerfile安装最新的软件包版本无需进一步编码或手动干预。这种技术被称为缓存破坏。您还可以通过指定包版本来实现缓存破坏。这就是所谓的版本固定。例如
RUN apt-get update apt-get install -y \package-bar \package-baz \package-foo1.3.*
版本固定强制构建检索特定版本而不管缓存中有什么。这种技术还可以减少由于所需软件包中的意外变化而导致的故障。 下面是一个格式良好的RUN说明演示了所有的apt-get建议。
RUN apt-get update apt-get install -y \aufs-tools \automake \build-essential \curl \dpkg-sig \libcap-dev \libsqlite3-dev \mercurial \reprepro \ruby1.9.1 \ruby1.9.1-dev \s3cmd1.1.* \ rm -rf /var/lib/apt/lists/*
s3cmd参数指定版本1.1.*。如果映像以前使用的是旧版本则指定新版本会导致apt-get-update的缓存中断并确保安装新版本。在每行列出包也可以防止包重复中的错误。 此外当您通过删除/var/lib/apt/lists来清理apt缓存时它会减小镜像大小因为apt缓存不是存储在层中的。由于RUN语句以apt-get-update开始因此总是在安装apt-get之前刷新包缓存。