【问题标题】:Dockerfile env dependent starting pointDockerfile env 依赖的起点
【发布时间】:2019-09-29 14:19:24
【问题描述】:

接码头工人,演出有点晚了,但迟到总比没有好。

根据一些在线教程,我找到了一个 docker 文件,并为我的第一个微服务节点 + mongo 使用了 docker-compose。

dev 的设置很糟糕,所以现在将实现可信赖的 pm2:https://dev.to/itmayziii/step-by-step-guide-to-setup-node-with-docker-2mc9

生产需要以下内容,但开发人员希望 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

码头工人撰写

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

【问题讨论】:

  • 为什么要更改容器内的文件以进行开发?您是否正在容器中开发此应用程序?我不关注你的用例。
  • 在开发期间,我想运行我的pm2.dev.config.js,它会监视文件构建的文件,从而允许在不重新启动 docker 的情况下进行开发。在产品上,我只想简单地运行node ./build/server.js
  • @LawrenceCherone 这不会要求我也必须在生产中使用 docker-compose 吗?这我不需要,因为在生产中 mongodb 是容器中其他地方的服务,因此我不想运行 docker compose。
  • 或者我应该在 compose 中设置 1 个,在 dockerfile 中设置 1 个?

标签: node.js docker docker-compose dockerfile


【解决方案1】:

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

如果是 Docker,最好使用 tag 代替 dev, stage and production。原因有很多,一个原因是mount code在开发环境中可以,但不建议在生产环境中使用。

在构建图像时,始终tag 使用有用的标签进行编码 版本信息、预期目标(prod or test, for instance)、稳定性或其他有用的信息 在不同的环境中部署应用程序。 不要依赖 自动创建的最新标签

Docker App development best-practices

但如果仍想使用 ENV 方法,则可以使用 docker-entrypoint 脚本。

Dockerfile

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

 docker run --env NODE_ENV=development -it --rm dev

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2019-12-30
    相关资源
    最近更新 更多