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

时间:2018-03-14 04:12:57

标签: node.js amazon-web-services 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" ]

并在package.json中我有这个:

"scripts": {
  "start": "node start.js",
  "stagestart": "NODE_ENV=content-staging node start.js"
}

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

2 个答案:

答案 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进行一些更改。

这就是我过去实现过这些目标的方式。