Docker - 构建镜像
Docker - 构建 Dockerfiles
Section titled “Docker - 构建 Dockerfiles”一旦创建了包含镜像构建指令的 Dockerfile 文件,下一步就是使用 docker build 命令来构建镜像。
docker build 命令
Section titled “docker build 命令”此命令从 Dockerfile 和“上下文 (context)”构建 Docker 镜像。上下文是一组位于指定位置 (PATH 或 URL) 的文件,通常是包含 Dockerfile 的目录。
docker build [OPTIONS] PATH | URL | --t,--tag name:tag:使用 ‘name:tag’ 格式命名镜像并可选地指定标签。强烈建议使用此选项以便于引用。-f,--file path/to/Dockerfile:如果 Dockerfile 文件未命名为Dockerfile或不在上下文目录的根目录下,则指定其路径。.(点号):通常用作PATH参数,表示当前目录为构建上下文。--no-cache:禁用构建缓存,强制 Docker 重新运行所有指令。--build-arg key=value:设置构建时变量,可在 Dockerfile 中的ARG指令中使用。
假设您在当前目录(.)中有一个简单的 Dockerfile:
# Simple Dockerfile exampleFROM ubuntu:22.04LABEL maintainer="demo@example.com"RUN apt-get update && apt-get install -y --no-install-recommends curl && apt-get clean && rm -rf /var/lib/apt/lists/*CMD ["echo", "My custom image built successfully!"]要构建此镜像并将其标记为 myimage,版本为 0.1,可以运行:
docker build -t myimage:0.1 .解释:
docker build:启动构建过程的命令。-t myimage:0.1:将生成的镜像标记为myimage,标签为0.1。.:指定当前目录为构建上下文。Docker 将在此处查找Dockerfile,并将此目录的内容(遵循.dockerignore)发送给 Docker 守护进程 (daemon)。
构建过程输出
Section titled “构建过程输出”在构建过程中,Docker 按顺序执行 Dockerfile 中的每条指令:
- 从
FROM指令开始,如果本地不存在基础镜像(ubuntu:22.04),则可能先拉取它。 - 对于后续的每条指令(
LABEL,RUN,CMD等),Docker 会检查是否可以重用先前构建中的缓存层。如果指令及其上下文没有改变,就会使用缓存(从而加快构建速度)。 - 如果无法从缓存中重用层(或禁用了缓存),Docker 会执行该指令,创建一个新的中间容器,运行命令(例如
apt-get update ...),并将结果提交为一个新的镜像层。 - 您将看到指示步骤编号、正在执行的指令以及中间容器 ID 的输出。
- 最后,如果构建成功,它会将最终层标记为您指定的名称和标签(
myimage:0.1),并报告最终的镜像 ID。
示例输出片段:
Sending build context to Docker daemon 2.048kBStep 1/4 : FROM ubuntu:22.04 ---> a7be6190844eStep 2/4 : LABEL maintainer="demo@example.com" ---> Running in abcdef123456 ---> 2f3a4b5c6d7eRemoving intermediate container abcdef123456Step 3/4 : RUN apt-get update && apt-get install -y --no-install-recommends curl && apt-get clean && rm -rf /var/lib/apt/lists/* ---> Running in 123456abcdef(apt-get output...) ---> 8e7d6c5b4a3fRemoving intermediate container 123456abcdefStep 4/4 : CMD ["echo", "My custom image built successfully!"] ---> Running in fedcba987654 ---> 9a8b7c6d5e4fRemoving intermediate container fedcba987654Successfully built 9a8b7c6d5e4fSuccessfully tagged myimage:0.1构建完成后,您可以使用 docker images 验证镜像是否存在:
docker images您应该会看到列出了 myimage 及其标签 0.1。现在可以从这个自定义镜像运行容器了。
构建上下文与 .dockerignore
Section titled “构建上下文与 .dockerignore”构建上下文非常重要。当使用 COPY 或 ADD 等指令时,Docker 会在上下文目录内查找指定的文件。发送不必要的文件(如 .git 目录、构建产物、本地依赖项)会减慢构建速度并增加镜像大小。在上下文目录根目录使用 .dockerignore 文件(语法类似于 .gitignore)来排除文件和目录,使其不被发送到守护进程 (daemon)。