如何在 docker-compose.yml 中针对不同的构建环境 运行 不同的 ENTRYPOINT 命令?

How to run different ENTRYPOINT commands in docker-compose.yml for different build environments?

现在我有一个 docker-compose.yml:

version: "3"

services:
  hello-world:
    image: hello-world
    build: .
    environment:
      NODE_ENV: development
    ports:
      - 3000:3000
    entrypoint: npm run dev
    # entrypoint: npm start
    working_dir: /
    volumes:
      - ./distService:/distService

您看到 entrypoint 命令有 2 个选项。当我开发时,我需要它 运行 npm run dev。当我部署它时,我需要它 运行 npm start.

如何在保留单个 docker-compose.yml 文件的同时执行此操作?

有没有办法将某种构建参数/ENV 变量传递给 docker-compose?人们通常如何处理这个问题?

好吧,首先,您想使用生产默认值(例如 ENTRYPOINT)构建 Dockerfile。

然后,很容易利用 docker-compose 默认情况下会同时处理 docker-compose.ymldocker-compose.override.yml 的事实。

因此,在 docker-compose.yml 中构建基本的生产就绪定义,并在覆盖文件中添加特定的开发覆盖,例如本地卷映射和入口点。

docker-compose up 等命令将自动与您的开发堆栈一起使用,生产部署可以通过明确指定 -f docker-compose.yml 来完成。

这是一个可能如何构建的示例。

Docker 文件

FROM node AS builder

# Your usual setup here

WORKDIR /src

FROM builder AS build

COPY /src .
RUN npm build

FROM node AS final

COPY --from=build /src/build /app
WORKDIR /app
ENTRYPOINT ["npm", "start"]

docker-compose.yml

version: '3.8'

services:
  hello-world:
    image: hello-world:prod
    build: .
    ports:
    - 3000:3000

docker-compose.override.yml

version: '3.8'

services:
  hello-world:
    image: hello-world:dev
    environment:
      NODE_ENV: development
    entrypoint: npm run dev
    build:
      target: builder
    volumes:
    - ./src:/src