Docker で環境変数を設定する
環境変数は、アプリケーションの開発に役立つ追加の構成またはメタデータを追加するために使用され、さまざまな形式で存在できます。
たとえば、Java アプリケーションを開発する場合、通常、Java 開発キットの場所を指す環境変数を設定して、アプリケーションをコンパイルして実行できるようにします。
同様に、Docker を使用してアプリケーションを開発するときに、コンテナーの環境変数を設定できます。 このチュートリアルでは、ENV
変数を設定する方法と、必要に応じて実行中のコンテナーから変数にアクセスする方法を学習します。
新しいプロジェクトを作成する
WebStorm IDEA
を開き、File
> New
> Project
を選択します。 開いたウィンドウで Node.js を選択し、プロジェクト名を untitled
から docker-env-variables
に変更するか、任意の名前を使用します。
ノード インタープリター
および パッケージ マネージャー
セクションがコンピューターから自動的に追加されるように、ノード ランタイム環境がインストールされていることを確認します。 最後に、Create
というラベルの付いたボタンを押して、プロジェクトを生成します。
このアプリケーションでは expressjs
を使用しているため、次のコマンドを使用して expressjs
をアプリケーションにインストールします。
~/WebstormProjects/docker-env-variables$ npm install express
expressjs
をインストールしたら、index.js
という名前のファイルを docker-env-variables
フォルダーに作成し、次のコードをコピーしてファイルに貼り付けます。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.json(
[{
name: 'Lenovo Legion 5 pro',
type: 'electronic',
price: 1500
},
{
name: 'Xiaomi pro 14',
type: 'electronic',
price: 1300
},
])
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
このファイルでは、e コマース環境で製品の配列を返すアプリケーションをシミュレートしました。このアプリケーションを使用して、このチュートリアルで説明する例をテストします。
Dockerfile を作成する
docker-env-variables
フォルダーに Dockerfile
という名前のファイルを作成します。 Dockerfile
は、カスタム イメージの構成を定義するのに役立つファイルです。
環境変数の設定には、ARG
命令と ENV
命令の 2つの方法があります。
これら 2つの命令の違いは、実行中のコンテナーは、ARG
命令を使用して設定された環境変数にアクセスできないことです。これらはイメージのビルド時にしか使用できないためです。 次のセクションでは、これらの手順を使用して目的を達成する方法を示します。
ARG
命令を使用して環境変数を設定する
次の手順をコピーして、前のセクションで作成した Dockerfile
という名前のファイルに貼り付けます。
FROM node:16.17.0-alpine
ARG APP_NAME
ARG APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
FROM
命令は、カスタム イメージを作成するベース イメージを設定します。 私たちの場合、ノードの軽量バージョンをプルする alpine
を使用しました。
ARG
は、Docker ビルダーがイメージのビルドに使用できる変数を定義します。 この命令を使用して提供される変数は、必須またはオプションです。
Docker のドキュメントには リファレンス があり、他の手順を読むことができます。
この例では、APP_NAME
という名前のオプション変数と、APP_VERSION
という名前の必須変数を提供しています。
これらの変数は、イメージのビルド時にのみ使用できることに注意してください。 次のセクションでこれを検証します。
イメージを作成する
次のコマンドを使用して、タグ docker-env:latest
でイメージをビルドします。
~/WebstormProjects/docker-env-variables$ docker build --tag docker-env:latest .
このコマンドは、Dockerfile
を順番に実行し、以下に示すように、実行中の各ステップを表示できます。
=> [1/6] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6 0.0s
=> CACHED [2/6] RUN echo "build an image of ${APP_NAME} version 1.0.0" 0.0s
=> [3/6] WORKDIR /com/ecommerce 0.6s
=> [4/6] ADD package*.json ./ 0.8s
=> [5/6] RUN npm install 6.7s
=> [6/6] COPY . .
イメージをビルドするとき、以下に示すように、空の環境変数の値を指定するか、--build-arg
コマンドを使用してデフォルトの環境値をオーバーライドできます。
~/WebstormProjects/docker-env-variables$ docker build --build-arg APP_NAME=ecommerce-app --tag docker-env:latest .
コンテナを実行する
以下のコマンドを使用して、ホストでポート 3000
を公開する docker-env-prod
という名前のコンテナーを実行します。
~/WebstormProjects/docker-env-variables$ docker run --name docker-env-prod -d -p 3000:3000 docker-env:latest
このコマンドはアプリケーションのインスタンスを実行し、ブラウザーの localhost:3000
(http://localhost:3000/) でアクセスできます。 ただし、ARG
命令を使用して設定された環境変数にアクセスできるかどうかを確認することを目的としています。
これを確認するには、以下のコマンドを使用して、インタラクティブ モードでコンテナ ファイル システムにアクセスします。
~/WebstormProjects/docker-env-variables$ docker exec -it docker-env-prod /bin/sh
出力:
/com/ecommerce #
現在の環境変数を表示するには、以下のコマンドを使用します。ARG
命令を使用して設定した 2つの変数が表示されないことに注意してください。
/com/ecommerce # printenv
出力:
NODE_VERSION=16.17.0
HOSTNAME=1bbf5ec4141e
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce
ENV
命令を使用して環境変数を設定する
Dockerfile
で以前の Docker の手順をコメントとして作成し、次の手順をコピーしてファイルのコメントの後に貼り付けます。
FROM node:16.17.0-alpine
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
この Dockerfile
の命令は前のものと同じで、唯一の変更は ARG
命令を ENV
命令に置き換えたことです。
ENV
は、Docker ビルダーがイメージの作成に使用できる環境変数を設定します。 環境変数は key-value
ペアの形式です。
これらの変数はオプションではないことに注意してください。宣言された各値には、オプション変数を許可する前の命令と比較した値が必要です。
前の例ではコンテナーを作成して実行する方法を示したので、この例でも同じアプローチを使用して同じことを実現します。 以下に示すように、ENV
命令を使用して、2つの環境変数 APP_NAME
と APP_VERSION
にアクセスできます。
NODE_VERSION=16.17.0
HOSTNAME=0cca1ee1340d
YARN_VERSION=1.22.19
SHLVL=1
HOME=/root
APP_NAME=ecommerce-app
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/com/ecommerce
APP_VERSION=1.0.0
環境変数を動的に設定する
コマンド ラインでイメージを作成する場合、ARG
命令を使用して、ENV
命令を使用して定義された変数に値を動的に割り当てることができます。
これを実際に見るには、Dockerfile
の前の手順をコメントとして作成し、次の手順をコピーしてファイルに貼り付けます。
FROM node:16.17.0-alpine
ARG HOST_MACHINE
ENV APP_NAME=ecommerce-app
ENV APP_VERSION=1.0.0
ENV DEV_ENV=$HOST_MACHINE
RUN echo "build an image of ${APP_NAME} version ${APP_VERSION}"
WORKDIR /com/ecommerce
ADD package*.json ./
RUN npm install
COPY . .
CMD node index.js
変数名 $HOST_MACHINE
を参照することにより、変数名 DEV_ENV
を持つ ENV
命令に動的に割り当てられる HOST_MACHINE
という名前の変数を持つ ARG
命令を追加したことに注意してください。
変数名 HOST_MACHINE
のデフォルト値を作成し、これを DEV_ENV
変数に割り当てるか、コマンド ラインで --build-arg
コマンドを使用して HOST_MACHINE
に値を割り当てます。 同じ結果が得られます。
まとめ
このチュートリアルでは、環境変数を設定する方法と、実行中のコンテナーからこれらの変数にアクセスする方法を学びました。 ARG
命令、ENV
命令の使用方法、および環境変数を動的に設定する方法を学びました。
ここで注目すべき主なポイントは、ARG
命令を使用して設定された環境変数には、実行中のコンテナーからアクセスできないことです。
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub