【问题标题】:Dockerfile, switch between dev / prodDockerfile,在 dev/prod 之间切换
【发布时间】:2018-10-23 07:24:02
【问题描述】:

我是 docker 新手,我已经在网上完成了他们的教程和其他一些事情,但仅此而已..所以我想我这样做的方式非常错误..

自从我在寻找一种发布 Dockerfile 的方法以来已经有一天了,该方法将启动 npm run devnpm 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 中挂载一个卷,但是对于仅在内部执行 if else 条件而言,它看起来非常冗长一个 Dockerfile。

目标

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

我正在寻找的是类似的东西:

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

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

另外,请注意,在我的主机中修改文件时,我不确定如何允许在容器中重新加载,我猜这完全与音量有关,但又不知道该怎么做..

【问题讨论】:

    标签: javascript node.js docker docker-compose dockerfile


    【解决方案1】:

    遗憾的是,无法在 Dockerfile 语法中应用此逻辑,一切都应该在入口点脚本中。为避免使用其他文件,您可以在一行 bash 脚本中实现此逻辑:

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

    【讨论】:

    【解决方案2】:

    您可以使用ENTRYPOINTCMD,这样您就可以在容器内执行bash 脚本作为第一个命令。

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

    在你的脚本中做你的事!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多