这是我的dockerfile:
FROM node:6-onbuild
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
ENV PORT 80
EXPOSE ${PORT}
CMD [ "npm","run", "start" ]
并在package.json中我有这个:
"scripts": {
"start": "node start.js",
"stagestart": "NODE_ENV=content-staging node start.js"
}
start
脚本用于生产,现在我想要一种在dockerfile中运行登台脚本的方法。有没有办法在dockerfile中读取NODE_ENV,所以我可以有一个dockerfile来处理暂存和生产。
答案 0 :(得分:7)
这是两种可能的实现方式。
仅供参考:如果您不需要在package.json中提及NODE_ENV 已在系统级别设置NODE_ENV或在docker中的构建时或运行时设置NODE_ENV。
此处Dockerfile
与此相同,但我习惯alpine
基本图片
FROM node:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
ENV PORT 3000
ARG DOCKER_ENV
ENV NODE_ENV=${DOCKER_ENV}
RUN if [ "$DOCKER_ENV" = "stag" ] ; then echo your NODE_ENV for stage is $NODE_ENV; \
else echo your NODE_ENV for dev is $NODE_ENV; \
fi
EXPOSE ${PORT}
CMD [ "npm","run", "start" ]
使用此命令构建此Dockerfile时
docker build --build-arg DOCKER_ENV=stag -t test-node .
您将在图层
看到 ---> Running in a6231eca4d0b your NODE_ENV for stage is stag
运行此docker容器并运行此命令时,输出将为
/usr/src/app # echo $NODE_ENV
stag
最简单的Approch 相同的图片,但在运行时设置环境变量
你的Dockerfile
FROM node:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
ENV PORT 3000
EXPOSE ${PORT}
CMD [ "npm","run", "start" ]
使用此命令运行此docker镜像
docker build -t test-node .
docker run --name test -e NODE_ENV=content-staging -p 3000:3000 --rm -it test-node ash
因此,当您在容器上运行此命令时,您将看到
/usr/src/app # echo $NODE_ENV
content-staging
这就是如何使用 NODE_ENV 启动节点应用程序而无需在package.json中设置环境变量。因此,如果您的nodejs配置基于 NODE_ENV ,则应根据 NODE_ENV 选择配置。
答案 1 :(得分:0)
您可以使用ENV指令将环境变量作为容器内的环境变量。有一个入口点脚本,它注入可用的环境变量(可能像sed这样简单的东西)来代替package.json文件中的占位符变量名。然后启动节点应用程序。显然,这将要求您在入口点脚本等方面对Dockerfile进行一些更改。
这就是我过去实现过这些目标的方式。