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

问题描述 投票:2回答:3

我正在寻找一种使用docker,docker-compose和nodejs在我的项目中同时具有developmentproduction环境的解决方案。

我该如何处理?

基本上我想要的是启动我的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

docker-compose.yml

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

package.json

// ...
    "scripts": {
        "build": "tsc",
        "dev": "nodemon source/index.ts",
        "prod": "node build/index.js"
    },
// ...
node.js docker docker-compose development-environment production-environment
3个回答
1
投票

您可以创建这样的结构:

docker-compose.yml -->
      docker-compose.dev.yml
      docker-compose.prod.yml

基本配置位于docker-compose.yml中,而特定于环境的信息(例如端口或用户凭据将位于docker-compose.dev.ymldocker-compose.prod.yml中]

然后您可以使用以下命令运行开发环境:

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.dev.yml \
    up -d

或带有以下内容的产品环境:

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.prod.yml \
    up -d

1
投票

您可以使用入口点并将命令传递到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"]

Main docker-compose.yml

version: "3"
services:
    findus:
        build: .
        ports:
            - "1234:1234"
        links:
            - mongo
        container_name: myapp
    mongo:
        image: mongo
        restart: always
        ports:
            - "4444:4444"

然后有两个docker-compose文件,将传递的命令附加到映像入口点。为了开发-docker-compose.dev.yml

version: "3"
services:
    findus:
        command: dev

docker-compose.prod.yml

version: "3"
services:
    findus:
        command: prod

然后启动开发环境:

docker-compose  -f docker-compose.yml -f docker-compose.dev.yml up    

并且适用于产品环境:

docker-compose  -f docker-compose.yml -f docker-compose.prod.yml up   

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


如果您要将命令作为环境变量传递,此方法也可以与环境变量一起使用。您可以在docs中找到更多信息。


0
投票

一种方法是像这样在Dockerfile上创建两个“目标”:

Dockerfile:

FROM node:13-alpine As development

RUN mkdir /app

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM node:13-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /app/dist ./dist

CMD ["node", "dist/index.js"]

并且它们在您的docker-compose上仅运行开发版本:

version: '3.7'

services:
  main:
    container_name: main
    build:
      context: .
      target: development
    command: npm run dev
...

因此,在您的开发环境中,您可以运行:

docker-compose up

并且在产品中,您可以直接使用]运行docker>

docker run --target production

我假设当您运行“ npm run build”时,您正在生成一个dist / production文件夹,因此最好在该目录中运行节点,而不是直接在根文件夹中运行index.js。

© www.soinside.com 2019 - 2024. All rights reserved.