😸
Dockerで起動したreactで環境変数が取得できない
Dockerで起動したreactで環境変数が取得できなかったときのメモです。
環境変数の全体像が知りたい!という方は下記の記事を参照してね
摘要
- マルチステージビルドでは、ビルドステージとランタイムステージが存在する
- reactは環境変数をビルド時に読み込む
- 具体的にはDockerfile内でビルドステージ中にENVコマンドを利用して環境変数を設定する
- docker composeであれば、「.env」の値をdocker-compose.ymlを通じてargでビルド時の引数として渡すことができる(.envファイルはdocker compose時に読み込まれているが、ビルド時には設定されない)
ゴール
マルチステージビルドで起動したreact内で環境変数を取得する
現状
環境変数が取得できない
選択肢
前提
DockerfileのENVに環境変数を定義
値の読み込み先は複数の選択肢が存在する
- 「--build-arg」オプション
複数環境変数がある場合はコマンドが長くなる
docker build --build-arg API_URL=https://api.example.com -t my-app .
- 「.env」ファイル(docker-composeでしか利用不可?)
環境ごとに異なる設定が可能
環境変数の一元管理が可能
[.env]
API_URL=https://api.example.com
- docker-compose.ymlの「args」オプション
環境ごとに異なる設定が可能
version: '3'
services:
web:
build:
context: .
args:
API_URL: https://api.example.com
ports:
- "3000:3000"
どれが良いのか
環境変数を一元管理したいのと、docker-compose.ymlを複雑にしたくないので「.env」ファイルから取得する方法を採用・・・したいが今回は一旦「--build-arg」オプションで試してみる
やってみる
[dockerfile]
# ベースイメージとしてNodeを使用してビルドする
FROM node:18 AS build
# ビルド引数を定義
ARG REACT_APP_API_BASE_URL
# ビルド引数を使って環境変数を設定
ENV REACT_APP_API_BASE_URL=$REACT_APP_API_BASE_URL
RUN echo "Building for environment: $REACT_APP_API_BASE_URL"
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Nginxをベースにして、ビルド結果を配信する
FROM nginx:alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY ./docker/nginx.conf /etc/nginx/conf.d/
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
[コマンド]
$ docker build --progress plain --no-cache -t test-get-variable:latest --build-arg REACT_APP_API_BASE_URL=http://env:8080 .
$ docker run -d --rm -p 80:80 --name test test-get-variable nginx -g 'daemon off;'
結果
[ログ]
#10 [build 2/7] RUN echo "Building for environment: http://env:8080"
備考(docker composeで行う場合のメモ。確認後追記します)
[docker-compose.yml]
version: '3'
services:
app:
build:
context: .
args:
API_URL: ${API_URL}
API_KEY: ${API_KEY}
ports:
- "3000:3000"
[.env]
API_URL=https://api.example.com
API_KEY=myapikey
[Dockerfile]
FROM node:14
# ビルド引数を取得
ARG API_URL
ARG API_KEY
# 環境変数として設定
ENV REACT_APP_API_URL=$API_URL
ENV REACT_APP_API_KEY=$API_KEY
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
Discussion