将NODE_ENV传递给docker以运行package.json脚本

Ema*_*avi 5 amazon-web-services node.js docker dockerfile

这是我的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" ]
Run Code Online (Sandbox Code Playgroud)

在package.json我有这个:

"scripts": {
  "start": "node start.js",
  "stagestart": "NODE_ENV=content-staging node start.js"
}
Run Code Online (Sandbox Code Playgroud)

start脚本是用于生产的,现在我想要一种在dockerfile中运行staging脚本的方法.有没有办法在dockerfile中读取NODE_ENV,所以我可以有一个dockerfile来处理staging和production.

Adi*_*iii 11

这是两种可能的实现方式.

仅供参考:如果您已在系统级别设置NODE_ENV或在生成时间或在docker中运行时设置NODE_ENV,则无需在package.json中提及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" ]
Run Code Online (Sandbox Code Playgroud)

使用此命令构建此Dockerfile时

docker build --build-arg DOCKER_ENV=stag -t test-node .
Run Code Online (Sandbox Code Playgroud)

你会在图层看到

 ---> Running in a6231eca4d0b your NODE_ENV for stage is stag
Run Code Online (Sandbox Code Playgroud)

当您运行此docker容器并运行此命令时,您的输出将是

/usr/src/app # echo $NODE_ENV

stag
Run Code Online (Sandbox Code Playgroud)

最简单的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" ]
Run Code Online (Sandbox Code Playgroud)

使用此命令运行此docker镜像

docker build -t  test-node .

 docker run  --name test -e NODE_ENV=content-staging  -p 3000:3000 --rm -it test-node ash
Run Code Online (Sandbox Code Playgroud)

因此,当您在容器上运行此命令时,您将看到

/usr/src/app # echo $NODE_ENV
content-staging
Run Code Online (Sandbox Code Playgroud)

因此,这就是如何使用NODE_ENV启动节点应用程序而无需在package.json中设置环境变量.因此,如果您的nodejs配置基于NODE_ENV,它应该根据NODE_ENV选择配置.