【问题标题】:How to run different ENTRYPOINT commands in Dockerfile for different build environments?如何在 Dockerfile 中针对不同的构建环境运行不同的 ENTRYPOINT 命令?
【发布时间】:2021-03-19 01:43:25
【问题描述】:

现在我有一个Dockerfile

FROM node:12-slim

WORKDIR /

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

RUN npm install

ENTRYPOINT npm start
# ENTRYPOINT npm run dev

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

如何在保留单个 Dockerfile 文件的同时做到这一点?

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

这是我的运行方式:

docker run hello-world:latest

【问题讨论】:

    标签: node.js docker dockerfile docker-build


    【解决方案1】:

    如果您将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 选项,但它的语法很尴尬。)

    人们通常如何处理这个问题?

    我尽可能多地在 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
    

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

    【讨论】:

    • 你绝对是对的。我不应该使用正在运行的 docker 容器进行开发。完全没有必要这样做。我应该只在本地运行express 服务器,它的行为应该非常相似。感谢您的所有建议。
    • 如果你想在外面做开发但在容器环境中运行应用程序,你可以创建一个绑定挂载卷。
    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2012-12-01
    • 2020-11-17
    • 2013-11-12
    相关资源
    最近更新 更多