docker-compose.ymlのserviceの1つにenv_file
を指定し、環境変数を設定したが、サービスがbuildするコンテナ内(Dockerfile側)では参照できなかった。
vueのアプリケーションをコンテナ内でnpmを使ってビルドしており、アプリケーション側でprocess.env.VUE_APP_API_ENDPOINT
という形でアプリケーションのビルド時に環境変数を参照させたかった。
docker-compose.ymlで指定するenv_file
やenvironment
といったキーはコンテナのビルド後に参照できるようになるため、それらのキーを利用するだけではコンテナビルド中では参照することができない。
docker-compose.ymlでargs
キーを指定し、変数をコンテナに渡すことで解決した。
.env
VUE_APP_API_ENDPOINT="http://gobel-api.local"
Dockerfile
FROM node:14.3.0-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# 引数を受け取ってコンテナ内で環境変数を定義
ARG VUE_APP_API_ENDPOINT
ENV VUE_APP_API_ENDPOINT=${VUE_APP_API_ENDPOINT}
# アプリケーションのビルド。環境変数を参照できる。
RUN npm run local-build
FROM nginx:1.19.0-alpine
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./nginx/conf.d/gobel-admin-client.conf /etc/nginx/conf.d/gobel-admin-client.conf
COPY --from=build-stage /app/dist /var/www/html
docker-compose.yml
version: "3.8"
services:
app:
container_name: "gobel-admin-client"
# 環境変数はファイルから読み込む
env_file: ".env"
build:
context: "./app"
dockerfile: "Dockerfile"
# 変数をコンテナのビルド時に渡す
args:
VUE_APP_API_ENDPOINT: $VUE_APP_API_ENDPOINT
ports:
- "82:80"
networks:
- gobel_link
networks:
gobel_link:
external: true
参考までにビルド時に環境変数を参照したいアプリケーション側のコードを記載。
const apiClient = axios.create({
baseURL: process.env.VUE_APP_API_ENDPOINT,
headers: {
"Content-Type": "application/json"
},
responseType: "json"
});
関連書籍