我是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中安装卷,但是仅在Dockerfile中执行if else条件看起来太冗长了。

目标

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

我正在寻找的东西是这样的:
if [ "$NODE_ENV" = "dev" ]; then
   CMD ["nodemon", "server.js"] // dev env
else
   CMD ["node", "server.js"] // prod env
fi

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

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

最佳答案

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

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

关于javascript - Dockerfile,在dev/prod之间切换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52943338/

10-11 07:24