繁体   English   中英

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

[英]Node + Docker Compose: Development and production setup

我正在寻找使用 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

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"
    },
// ...

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

Dockerfile

FROM node:13-alpine

RUN mkdir /app

WORKDIR /app

COPY . /app

RUN npm install

RUN npm run build

EXPOSE 1234

ENTRYPOINT ["npm", "run"]

主要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 文件到 append 命令传递给镜像入口点。 用于开发 - 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指令中。


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

一种方法是在 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向上

他们在产品中,您可以直接运行 docker

docker 运行——目标生产

我假设当你运行“npm run build”时,你正在生成一个 dist/production 文件夹,所以最好在那里运行 node 而不是直接在根文件夹上的 index.js 上运行。

您可以创建这样的结构:

 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

或 prod 环境:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM