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

cbd*_*per 8 docker docker-compose docker-build

现在我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*cke 7

首先,您需要使用生产默认值(例如内置的 ENTRYPOINT)来构建 Dockerfile。

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

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

docker compose upetc 命令将自动与您的开发堆栈配合使用,可以通过显式指定来完成生产部署-f compose.yml

下面是一个如何构建它的示例。

Dockerfile

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

compose.yml

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

compose.override.yml

services:
  hello-world:
    image: hello-world:prod
    build: .
    ports:
    - 3000:3000
Run Code Online (Sandbox Code Playgroud)