docker - 使用 --target 标志构建多阶段 Dockerfile 会构建所有阶段,而不仅仅是指定的阶段

标签 docker

来自 docker build docs ,您可以指定带有阶段名称的 --target 标志来构建它。此外,multi-stage build docs 中也指定了相同的内容。 .

When you build your image, you don’t necessarily need to build the entire Dockerfile including every stage. You can specify a target build stage. The following command assumes you are using the previous Dockerfile but stops at the stage named builder:

$ docker build --target builder -t alexellis2/href-counter:latest .

我有一个 Dockerfile 来构建我的项目。它有多个阶段:

# development
FROM node:carbon as development
...

# e2e tests
FROM node:carbon as puppeteer
...
COPY --chown=puppeteer:puppeteer --from=development /app /home/puppeteer
...

# prod build
FROM node:carbon as build
...

# prod image behind webserver
FROM nginx as prod
...
COPY --from=build /app/build /usr/share/nginx/html
...

当我尝试为 prod 阶段构建时:

docker build -t my-app --target prod .

我看到它正在构建所有阶段的日志,导致构建需要很长时间。

我希望它只构建我指定的目标(及其阶段“依赖”),以便它构建 build 阶段,然后是 prod 阶段。

我做错了什么或者我错过了什么?

注意:我也知道,也许我对多阶段构建的功能有错误的期望,但是文档听起来好像您可以构建您想要的目标而不是整个文件,所以我'我会假设是这样的。

最佳答案

从 Docker 18.09 开始,您可以使用 BuildKit .好处之一是跳过未使用的阶段,因此您只需使用 DOCKER_BUILDKIT=1 docker build -t my-app --target prod 进行构建。

Reference

关于docker - 使用 --target 标志构建多阶段 Dockerfile 会构建所有阶段,而不仅仅是指定的阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51253987/

相关文章:

docker 推 "denied: requested access to the resource is denied"

docker - 无法缩减Kubernetes部署(规模过大)

python - 如何在 Wine 模拟的 python 版本(在 docker 容器内)中正确安装和运行 pip?

regex - 如何检查 docker 实例是否在 Bash 中运行

typescript - Testcafe Docker - 错误 : TypeScript compilation failed. 找不到名称 'require'

linux - 无法从外部机器访问公开暴露的 Docker 容器端口,只能从本地主机访问?

postgresql - Docker Tomcat 容器无法访问 Postgres 容器

docker - 挂载卷时无法运行 mariadb

docker - 带有Mongo和Express的Docker

docker - 如何在容器内获取BLOCK I/O和NET I/O