失敗談と解決方法です
やらかしたメモ
実現させたかったこと
Azure上のApp Serviceで設定した環境変数をデプロイしたDockerイメージで使用したかった。
CRA(Create React App)を使用しているため、.envファイルにREACT_APP_
と先頭とつけて書いておくと環境変数として読み込まれる。。
→ App Serviceから環境変数として渡されている値をもとに.env
を生成する。
試した実装と望んでいた動作
DockerfileのCMDを使用してDocker run
のタイミングで.env
を生成するシェルスクリプトを実行する。
↓↓↓
CMD [ "/bin/bash", "-c", "./env.sh" ]
#!/bin/bash
rm -rf .env
touch .env
while read -r line || [[ -n "$line" ]];
do
if printf '%s\n' "$line" | grep -q -e '='; then
varname=$(printf '%s\n' "$line" | sed -e 's/=.*//')
varvalue=$(printf '%s\n' "$line" | sed -e 's/^[^=]*=//')
fi
value=$(printf '%s\n' "${!varname}")
[[ -z $value ]] && value=${varvalue}
echo "$varname = \"$value\"" >> .env
done < .env.key
REACT_APP_ID =
REACT_APP_PW =
.env.key
にある変数名をもとに.env
を生成して、下の要領でアプリケーション内で読み込みたかった。
id = process.env.REACT_APP_ID;
pw = process.env.REACT_APP_PW;
原因
.env
の読み込みタイミングはDockerfile内のyarn build
が実行されたとき。
yarn build
が実行されているのはdocker build
をした際のみで、.env
が生成される前。
docker run
が実行されるのもApp Serviceから環境変数が渡されるのもdocker build
が終了し、App Serviceにデプロイされたタイミング。
→ .env
の生成自体は成功していたが読み込まれていなかった。
ただのミスだった…
解決策
下記のようにenvファイルを変更して、環境変数を保持するjsファイルを生成する。
index.html
のhead
でスクリプトとして読み込ませることで、window._env_.***
として呼び出すことができる。
id = window._env_.REACT_APP_ID;
pw = window._env_.REACT_APP_PW;
#!/bin/bash
rm -rf ./env-config.js
touch ./env-config.js
echo "window._env_ = {" >> ./env-config.js
while read -r line || [[ -n "$line" ]];
do
if printf '%s\n' "$line" | grep -q -e '='; then
varname=$(printf '%s\n' "$line" | sed -e 's/=.*//')
varvalue=$(printf '%s\n' "$line" | sed -e 's/^[^=]*=//')
fi
value=$(printf '%s\n' "${!varname}")
[[ -z $value ]] && value=${varvalue}
echo " $varname: \"$value\"," >> ./env-config.js
done < .env
echo "}" >> ./env-config.js
<head>
...
<script src="%PUBLIC_URL%/env-config.js"></script>
...
</head>