Node.js Dockerfile环境相关起始点

Node.js Dockerfile环境相关起始点,node.js,docker,docker-compose,dockerfile,Node.js,Docker,Docker Compose,Dockerfile,去接docker,有点晚了,但晚了总比不来好 在一些在线教程之后,我找到了docker文件,并为我的第一个microservice node+mongo编写了docker compose dev的设置非常糟糕,因此现在将实施可靠的pm2: 生产部门可能需要以下命令,但开发人员i希望pm2实例管理器在文件更改时重新启动 但我现在面临的一个明显的问题是如何在Dockerfile中区分dev和prod Dockerfile FROM node:12-alpine RUN mkdir -p /usr/s

去接docker,有点晚了,但晚了总比不来好

在一些在线教程之后,我找到了docker文件,并为我的第一个microservice node+mongo编写了docker compose

dev的设置非常糟糕,因此现在将实施可靠的pm2:

生产部门可能需要以下命令,但开发人员i希望pm2实例管理器在文件更改时重新启动

但我现在面临的一个明显的问题是如何在Dockerfile中区分dev和prod

Dockerfile

FROM node:12-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm i
COPY . /usr/src/app
EXPOSE 3000
CMD node ./build/server.js
FROM node:alpine
RUN npm install pm2 -g
COPY . /app
WORKDIR /app
ENV NODE_ENV=development
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT  ["sh","docker-entrypoint.sh"]
docker compose

version: "3"

services:

  ms-authentication-service:
    image: "ms-authentication-image"
    depends_on:
      - mongodb
    build:
      dockerfile: Dockerfile
      context: .
    links:
      - mongodb
    networks:
      - default
    ports:
      - "8080:8000"
    restart: always

  mongodb:
    image: mongo:4.2
    container_name: "ms-authentication-mongo-image"
    environment:
      MONGO_INITDB_ROOT_USERNAME: bob
      MONGO_INITDB_ROOT_PASSWORD: bob
    networks:
      - default
    ports:
      - 27017:27017

一般来说,管理环境(如基于ENV的暂存或生产)是常见的做法,但对于Docker来说,最好的方法是
tag

对于Docker,最好使用
tag
进行
dev、stage和production
。原因有很多,其中一个原因是
在开发环境中装载代码是可以的,但不建议在生产环境中使用

构建图像时,始终使用有用的标记对其进行编码 版本信息,预期目标<代码>(产品或测试,用于 实例)
、稳定性或其他在以下情况下有用的信息: 在不同的环境中部署应用程序不要依赖于 自动创建的最新标记

但如果仍然希望使用ENV方法,那么可以使用docker入口点脚本

Dockerfile

FROM node:12-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm i
COPY . /usr/src/app
EXPOSE 3000
CMD node ./build/server.js
FROM node:alpine
RUN npm install pm2 -g
COPY . /app
WORKDIR /app
ENV NODE_ENV=development
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT  ["sh","docker-entrypoint.sh"]
Docker入口点

 #!bin/sh 
     if [ $NODE_ENV = development ]; then
     pm2 start server.js
     else
     node server.js
    fi
因此,您可以开始了,您可以在Dockerfile或运行时中更改它

 docker run --env NODE_ENV=production -it --rm node:production


对于环境变量,为什么要更改容器中的文件以进行开发?您正在容器中开发此应用程序吗?我不了解您的用例。在开发过程中,我希望运行我的
pm2.dev.config.js
,它监视生成的文件,允许在不重新启动docker的情况下进行开发。在prod中,我只想运行
节点。/build/server.js
@lawrencerone,这难道不要求我也必须在生产中使用docker compose吗?我不需要这样做,因为在生产环境中,mongodb是其他地方的服务,而不是容器中的服务,因此我不想运行docker compose。或者我应该在compose中设置1个,在dockerfile中设置1个?