从多个源镜像创建新镜像
在这一步骤中,我们将学习如何通过合并多个源镜像的内容来创建新的 Docker 镜像。当你需要构建包含来自不同基础镜像或预构建镜像组件的镜像时,这是常见场景。
首先,让我们拉取必要的源镜像。我们将以 ubuntu
和 alpine
镜像为例。
docker pull ubuntu:latest
docker pull alpine:latest
你将看到镜像正在被拉取的输出信息。
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
现在,我们将使用 Dockerfile
创建新镜像。Dockerfile
是一个文本文件,包含用户可以通过命令行调用的所有命令来组装镜像。在你的 ~/project
目录中创建一个名为 Dockerfile
的新文件。
nano ~/project/Dockerfile
将以下内容添加到 Dockerfile
中:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
让我们分解这个 Dockerfile
:
FROM ubuntu:latest AS base
:这行将我们构建的第一阶段基础镜像设置为 ubuntu:latest
,并将此阶段命名为 base
。
FROM alpine:latest AS alpine_base
:这行开始一个新的构建阶段,使用 alpine:latest
作为基础镜像,并将此阶段命名为 alpine_base
。这是一个多阶段构建,允许我们在阶段之间复制文件。
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
:此命令从 alpine_base
阶段复制文件 /etc/alpine-release
到当前阶段的 /app/alpine-release
目录。
COPY --from=base /etc/os-release /app/ubuntu-release
:此命令从 base
阶段复制文件 /etc/os-release
到当前阶段的 /app/ubuntu-release
目录。
WORKDIR /app
:这将后续指令的工作目录设置为 /app
。
CMD ["ls", "-l"]
:这指定了从此镜像启动容器时要运行的默认命令。它将列出 /app
目录的内容。
按 Ctrl + X
,然后 Y
和 Enter
保存 Dockerfile
。
现在,使用 docker build
命令构建镜像。命令末尾的 .
指定了构建上下文,即当前目录 (~/project
)。
docker build -t my-multi-stage-image:latest ~/project
你将看到构建过程的输出,包括正在执行的不同阶段。
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
构建完成后,你可以通过列出本地镜像来验证镜像是否创建成功。
docker images my-multi-stage-image
你应该能在列表中看到新创建的镜像。
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
最后,让我们从这个镜像运行一个容器来查看复制的文件。
docker run --rm my-multi-stage-image:latest
--rm
标志会在容器退出时自动删除它。输出应显示从 ubuntu
和 alpine
镜像复制的文件。
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
这证实了我们通过使用多阶段构建合并多个源镜像的内容成功创建了一个新镜像。