如何在 Dockerfile 中针对不同的构建环境 运行 不同的 ENTRYPOINT 命令?

How to run different ENTRYPOINT commands in Dockerfile for different build environments?

现在我有一个 Dockerfile:

FROM node:12-slim

WORKDIR /

COPY ./package.json ./package.json
COPY ./dist ./dist

RUN npm install

ENTRYPOINT npm start
# ENTRYPOINT npm run dev

你看我有 2 个选项 ENTRYPOINT。当我开发时,我需要它 运行 npm run dev。当我部署它时,我需要它 运行 npm start.

如何在保留单个 Dockerfile 文件的同时执行此操作?

有没有办法传递某种构建参数/ENV 变量?人们通常如何处理这种情况?

我是这样运行的:

docker run hello-world:latest

如果您将 ENTRYPOINT 更改为 CMD,您可以在 docker run 命令行轻松覆盖它:

# No ENTRYPOINT
CMD npm start
# The command after the image name overrides CMD
docker run hello-world:latest npm run dev

(有一个 docker run --entrypoint 选项,但它的语法最终很尴尬。)

How do people usually handle this?

我在 Docker 之外尽我所能进行开发。我很少 运行 解决对确切解释器版本敏感的问题,而且主机环境通常也没有什么区别。对于在 Docker 中唯一发生的事情是应用程序构建的前端应用程序来说,这是双重的;所有 运行 时间和 I/O 都发生在最终用户的浏览器中。

# Without Docker
npm run dev
npm run test
npm run lint

# Ship it
docker build -t my/image .
docker run -p 3000:3000 my/image

如果可能,运行 在测试和生产环境中使用相同的图像。请勿使用绑定挂载或其他卷挂载覆盖映像中的代码。