web-dev-qa-db-ja.com

NODE_ENVをdockerに渡してpackage.jsonスクリプトを実行する

これは私の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を読み取る方法があるので、ステージングとプロダクションを処理する1つのdockerfileを使用できます。

7
Emad Dehnavi

2つの可能な実装があります。

参考:すでにシステムレベルで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" ]

このコマンドでこの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

Simplest 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

つまり、これは、package.jsonで環境変数を設定せずにNODE_ENVでノードアプリケーションを起動する方法です。したがって、nodejs設定がNODE_ENVに基づいている場合、NODE_ENVに従って設定を選択する必要があります。

13
Adiii

ENV命令を使用して、環境変数をコンテナー内の環境変数として取得できます。 package.jsonファイルにあるプレースホルダー変数名の代わりに、使用可能な環境変数(おそらくsedのような単純なもの)を挿入するエントリーポイントスクリプトを用意します。次に、ノードアプリケーションを起動します。明らかに、これには、エントリポイントスクリプトなどに関して、Dockerfileにいくつかの変更を加える必要があります。

それが、私が過去にそのようなことを達成した方法です。

0
Jesse