Dockerfile,在dev / prod之间切换

时间:2018-10-23 07:24:02

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

我是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 if条件,看起来就显得太冗长了一个Dockerfile

目标

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

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

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

也许我错了,关于如何在Docker中进行此类操作的任何好的建议都会很好。

另外,要注意的是,我不确定在修改主机中的文件时如何允许在容器中重新加载,我想这全都与音量有关,但又不确定如何做到。.

2 个答案:

答案 0 :(得分:2)

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

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

在脚本中做自己的事!

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

答案 1 :(得分:2)

遗憾的是,无法在Dockerfile语法中应用此逻辑,所有内容都应在入口点脚本中。为了避免使用其他文件,可以在单行bash脚本中实现以下逻辑:

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