gpt4 book ai didi

docker - 为什么我的 docker-compose 以我的 dockerfile 中的 prod 阶段为目标也运行 dev 目标?

转载 作者:行者123 更新时间:2023-12-02 21:31:05 26 4
gpt4 key购买 nike

为什么我的 docker-compose 以我的 dockerfile 中的 prod 阶段为目标也运行 dev 目标?

命令:

docker-compose -f 'docker-compose-prod.yml' up --build

我专门针对 docker-compose-prod.yml 中的 proddev 目标也在运行。

Step 4/18 : FROM base as dev
---> 89ae35cdccf6
Step 5/18 : RUN npm install
---> Using cache
---> 8d6693e78ce0
Step 6/18 : COPY . .
---> 93518e386a6e
Step 7/18 : RUN npm run build
---> Running in 44199ae5793a

docker 文件:

# base
FROM node:lts-alpine as base
WORKDIR /usr/src/app
COPY package*.json ./

# dev
FROM base as dev
RUN npm install
COPY . .
RUN npm run build
EXPOSE 8080
CMD ["npm", "run", "serve"]

FROM base as prod-build
RUN npm install
COPY . .
RUN npm run build:production

# prod
FROM nginx:stable-alpine as prod
COPY --from=prod-build /usr/src/app/dist /usr/share/nginx/html
COPY nginx/nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker-compose-prod.yml:

version: "3.7"

services:
app:
image: my-app:prod
build:
context: .
target: prod
ports:
- 80:80
restart: always

最佳答案

使用经典构建器,一个多阶段的 Dockerfile 从头到尾被解析,并且可以通过指定目标阶段停止一直解析到最后。通往目标阶段的所有阶段都构建在流程中。

Docker 一直在使用 buildkit它执行 Dockerfile 的依赖图分析并同时构建所有依赖项和目标阶段,跳过任何非依赖项的阶段。您可以通过在运行构建的 shell 中设置变量或在引擎中配置功能标志来切换到它。

export DOCKER_BUILDKIT=1
docker build ...

或者只是

DOCKER_BUILDKIT=1 docker build ...

或功能标志:

# cat /etc/docker/daemon.json
{ "features": {"buildkit": true } }

# systemctl reload docker

另一种选择是将您的 Dockerfile 拆分为单独的 dockerfile,因为开发镜像和生产镜像之间几乎没有依赖关系,基本镜像可以从中完全外部化。或者重新设计 Dockerfile,使这两个阶段几乎相同,并且 dev 或 prod 是另一个的轻微扩展。那么构建依赖阶段就没有缺点了。

关于docker - 为什么我的 docker-compose 以我的 dockerfile 中的 prod 阶段为目标也运行 dev 目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64446806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com