如何通过docker-compose.yml的env_file向Dockerfile传递环境变量?
问题
希望将环境变量从docker-compose.yml传递至Dockerfile的构建阶段,现有配置如下:
docker-compose.yml
version: '3.8' services: app: container_name: app-container image: app:latest build: context: ./ dockerfile: Dockerfile env_file: # Interpolation source files - ./env
.env
PORT=3000
Dockerfile
FROM node:16 RUN echo ${PORT} # Output should be '3000'
需求:通过.env文件统一管理配置,避免使用ARG,询问是否有可行方案。
可行方案
直接通过env_file定义的变量无法在Docker构建阶段(RUN指令执行时)获取,因为env_file是给容器运行阶段设置的环境变量。要在构建阶段不用ARG就能拿到.env里的变量,可以通过以下步骤实现:
修改Dockerfile:将
.env文件复制到镜像中,在执行RUN命令前先加载这个文件的环境变量FROM node:16 # 复制.env文件到镜像内 COPY .env .env # 加载.env并执行命令 RUN source .env && echo $PORT无需修改docker-compose.yml:当前配置的
build.context已经设为./,.env会被包含在构建上下文中,直接构建即可。
注意事项
- 如果
.env包含敏感信息,构建完成后建议在镜像内删除该文件:FROM node:16 COPY .env .env RUN source .env && echo $PORT && rm .env - 若使用alpine等默认shell为sh的基础镜像,需用
. .env替代source .env来加载环境变量。
内容的提问来源于stack exchange,提问作者passionateLearner
相关产品推荐
相关产品推荐

