Node + Docker Compose:开发和生产设置

Sir*_*hau 7 development-environment production-environment node.js docker docker-compose

我正在寻找一种使用 docker、docker-compose 和 nodejs 在我的项目中同时拥有开发生产环境的解决方案。

我该如何处理?

基本上我想要的是一个启动我的 docker 生产环境命令,以及一个启动我的开发环境命令(例如可以使用 nodemon)。

这是我的 Dockerfile

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

CMD ["npm", "run", "prod"] # <--- Have a possibility to run something like "npm run dev" here instead
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"
Run Code Online (Sandbox Code Playgroud)

包.json

// ...
    "scripts": {
        "build": "tsc",
        "dev": "nodemon source/index.ts",
        "prod": "node build/index.js"
    },
// ...
Run Code Online (Sandbox Code Playgroud)

mic*_*alk 13

您可以利用入口点并将命令传递给 docker 容器。然后,您可以使用 docker-compose inharitance 为您想要的环境启动 compose,并将命令附加到入口点。

Dockerfile

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

ENTRYPOINT ["npm", "run"]
Run Code Online (Sandbox Code Playgroud)

主要docker-compose.yml

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"
Run Code Online (Sandbox Code Playgroud)

然后有两个 docker-compose 文件来附加传递到图像入口点的命令。用于开发 - docker-compose.dev.yml

version: "3"
services:
    findus:
        command: dev
Run Code Online (Sandbox Code Playgroud)

docker-compose.prod.yml

version: "3"
services:
    findus:
        command: prod
Run Code Online (Sandbox Code Playgroud)

然后启动开发环境:

docker-compose  -f docker-compose.yml -f docker-compose.dev.yml up    
Run Code Online (Sandbox Code Playgroud)

对于产品环境:

docker-compose  -f docker-compose.yml -f docker-compose.prod.yml up   
Run Code Online (Sandbox Code Playgroud)

因此,command将附加到ENTRYPOINT指令中。


如果您想将命令作为环境变量传递,这种方法也可以使用环境变量。您可以在文档中找到更多信息。