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