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

Sam*_*her 3 docker docker-compose

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

命令:

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

我专门瞄准proddocker-compose-prod.yml目标dev也在运行。

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
Run Code Online (Sandbox Code Playgroud)

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;"]
Run Code Online (Sandbox Code Playgroud)

docker-compose-prod.yml:

version: "3.7"

services:
  app:
    image: my-app:prod
    build:
      context: .
      target: prod
    ports:
      - 80:80
    restart: always
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 5

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

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

export DOCKER_BUILDKIT=1
docker build ...
Run Code Online (Sandbox Code Playgroud)

要不就

DOCKER_BUILDKIT=1 docker build ...
Run Code Online (Sandbox Code Playgroud)

或者对于功能标志:

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

# systemctl reload docker
Run Code Online (Sandbox Code Playgroud)

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