我是Docker的新手,我已经在网络上完成了他们的教程和其他一些工作,但仅此而已。所以我想我是以一种非常错误的方式进行操作。
距离我正在寻找一种发布Dockerfile的方式已经过去了一天,该文件将根据产品或开发环境而启动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中安装卷,但是仅在内部执行if if条件,看起来就显得太冗长了一个Dockerfile
不使用任何其他文件(保持简单)
我正在寻找的是类似的东西:
if [ "$NODE_ENV" = "dev" ]; then
CMD ["nodemon", "server.js"] // dev env
else
CMD ["node", "server.js"] // prod env
fi
也许我错了,关于如何在Docker中进行此类操作的任何好的建议都会很好。
另外,要注意的是,我不确定在修改主机中的文件时如何允许在容器中重新加载,我想这全都与音量有关,但又不确定如何做到。.
答案 0 :(得分:2)
您可以使用ENTRYPOINT
或CMD
,以便可以在容器内执行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']