代码之家  ›  专栏  ›  技术社区  ›  Fabien Greard

Dockerfile,在dev/prod之间切换

  •  2
  • Fabien Greard  · 技术社区  · 7 年前

    npm run dev npm start ,取决于产品或开发环境。

    到目前为止我得到的:

    # Specify the node base image version such as node:<version>
    FROM node:10
    
    # Define environment variable, can be overight by runinng docker run with -e "NODE_ENV=prod"
    ENV NODE_ENV dev
    
    # Set the working directory to /usr/src/app
    WORKDIR /usr/src/app
    
    # Install nodemon for hot reload
    RUN npm install -g nodemon
    
    # Install app dependencies
    # A wildcard is used to ensure both package.json AND package-lock.json are copied
    # where available (npm@5+)
    COPY package*.json ./
    RUN npm install && \
        npm cache clean --force
    
    # Set the port used by the app
    EXPOSE 8080
    
    # Bundle app source
    COPY . .
    
    # Launch the app
    CMD [ "nodemon", "server.js" ]
    

    从我在www上看到的情况来看,人们倾向于使用bash来执行这种操作,或者在docker compose中装载卷,但是仅仅在Dockerfile中执行if-else条件看起来太冗长了。

    目标

    不使用任何其他文件(保持简单)

    if [ "$NODE_ENV" = "dev" ]; then 
       CMD ["nodemon", "server.js"] // dev env
    else
       CMD ["node", "server.js"] // prod env
    fi
    

    也许我错了,任何关于如何在docker做这样的事的好建议都是好的。

    另外,我也不确定在修改主机中的文件时如何允许在容器中重新加载,我猜这都是关于卷的问题,但我也不确定如何做到这一点。。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ignacio Millán    7 年前

    遗憾的是,没有办法在Dockerfile语法中应用此逻辑,所有内容都应该在entrypoint脚本中。为了避免使用其他文件,可以在一行bash脚本中实现此逻辑:

    ENTRYPOINT ["/bin/bash"]
    CMD ['-c','if [ "$NODE_ENV" = "dev" ]; then nodemon server.js; else node server.js; fi']
    
        2
  •  2
  •   Ntwobike    7 年前

    你可以用 ENTRYPOINT CMD 因此,可以在容器内执行bash脚本作为第一个命令。

    ENTRYPOINT["your/script.sh"]
    CMD["your/script.sh"]
    

    在你的剧本里做你该做的!

    即使您不需要传递env变量,因为在脚本中您可以访问它。