Docker で環境変数を設定する

David Mbochi Njonge 2023年6月20日
  1. 新しいプロジェクトを作成する
  2. Dockerfile を作成する
  3. ARG 命令を使用して環境変数を設定する
  4. ENV 命令を使用して環境変数を設定する
  5. 環境変数を動的に設定する
  6. まとめ
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_NAMEAPP_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 Mbochi Njonge avatar David Mbochi Njonge avatar

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

関連記事 - Docker Environment Variable