如何在Docker Compose配置中将.env文件变量传入Dockerfile构建阶段使用
问题原因
你当前配置的environment字段仅作用于容器运行时的环境变量,不会传递到镜像构建阶段,因此Dockerfile在构建过程中无法读取到该值,和变量的引号、大括号写法无关。
要实现构建阶段读取.env中的变量,需要使用Docker的构建参数(ARG) 来传递值,修改步骤如下:
步骤1:修改docker-compose.yml配置
将需要传递的变量配置到build.args字段下,Docker Compose会自动加载.env中的变量进行替换:
version: "2" services: my-app: build: context: . args: # 构建参数名: 从.env加载的变量 my_app_version: $MY_APP_VER container_name: my_app # 如果容器运行时也需要该变量,可以保留environment字段,否则可以删除 environment: - my_app_version=$MY_APP_VER
步骤2:修改Dockerfile接收构建参数
需要先通过ARG指令声明要接收的构建参数,之后就可以在整个构建阶段使用该变量:
FROM scratch # 声明接收构建参数 ARG my_app_version # 如果需要容器运行时也保留该变量,可以赋值给ENV,不需要可以省略这行 ENV my_app_ver=$my_app_version # 构建阶段可以直接读取变量,拼接URL时建议用大括号包裹变量名避免识别错误 RUN echo ${my_app_ver} # 示例:拼接下载URL # RUN wget https://example.com/app/${my_app_version}/install.tar.gz
语法说明
- 变量拼接场景下推荐使用
${变量名}的大括号写法,避免变量名和后续字符拼接时Docker识别错误 - 如果变量值没有空格、特殊符号,不需要额外加引号,有特殊符号时直接在.env文件中给变量值包裹引号即可
内容的提问来源于stack exchange,提问作者Saša Vranić
相关产品推荐
相关产品推荐

