Dockerfile如何在开发环境和生产环境下使用不同的启动命令?

3

我有一个TypeScript Node应用程序。我有开发和启动npm脚本:

"dev": "ts-node-dev src/index.ts",
"build": "npm run test:ci && tsc",
"start": "node dist/index"

在开发过程中,我会观察.ts文件的变化,当运行生产环境时,我希望从dist目录下运行.js文件(该目录是使用npm构建脚本生成的)。

这是我的Dockerfile:

FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./ 

RUN npm i --only=prod

COPY . . 

CMD ["npm", "run", "dev"] 

在开发环境下运行良好,但在生产环境中,CMD命令应该像这样:

CMD ["npm", "start"]

同时,RUN npm i --only-prod 命令也需要相应更改。

如何使其适应开发和生产环境?


docker run ... npm start - super
@super 你是什么意思? - Raz Buchnik
当您运行容器时,只需在启动容器时在命令行上提供相应的命令,即可覆盖应运行的命令。 - super
我正在使用 Kubernetes,它通过镜像的默认命令运行,而不是通过 CLI 手动运行。 - Raz Buchnik
@Raz Kubernetes可以配置成您想要的任何功能。如果您正在使用特定的设置并需要帮助,请在问题中包含该设置。也许您应该参考一下[tour]和[ask],以及如何制作[mre]。 - super
显示剩余2条评论
1个回答

1
在 Kubernetes 中,您可以覆盖默认命令“args”:
apiVersion: apps/v1
kind: Deployment
[...]
spec:
  template:
    spec:
      containers:
      - name: CONTAINER-NAME
        image: IMAGE-NAME
        args: [
          "npm",
          "start" ]

请查看kubernetes的文档

详细的实现取决于您使用的部署系统:

  • 您可以编写两个不同的.yaml文件,一个用于开发环境,另一个用于生产环境。
  • 如果您使用helm进行部署,则可以在每个环境的值文件中设置此配置。
  • 您还可以使用Kustomize,如此示例所述。

他们谈论了关于参数和环境变量的问题,这些可以用来解决我提出的问题,但是你的回答和他们的文档都没有直接回答我的问题。我想将启动命令从开发环境调整为生产环境,应该怎么做?你只给出了一个非条件性的命令。 - Raz Buchnik
我列出了一些可能的选项。 - Davide Madrisan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接