You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose构建镜像时环境变量未注入问题求助

解决GitLab CI传递环境变量至Rancher 2.5.5容器的两种方案

先明确你之前方法无效的核心原因

  1. docker-compose的env_file是运行时配置:只会在docker-compose run/up启动容器时生效,构建镜像阶段不会将变量写入镜像。
  2. docker-compose --env-file作用于compose模板变量:仅用于替换compose文件中${VAR}格式的占位符,不会传递给镜像构建过程。
  3. Entrypoint source变量的前提:镜像中必须包含对应的.env文件,且source后需确保变量能传递到应用进程(比如用exec启动应用),否则容器运行时无法读取。

方案一:构建镜像时内置环境变量(适合无需区分环境的场景)

通过Dockerfile的ARG+ENV组合,将构建阶段的变量固化到镜像中:

  1. 修改Dockerfile:
# 定义构建阶段接收的参数
ARG APP_ENV
ARG DB_HOST
ARG REDIS_PORT

# 将构建参数转为容器环境变量(固化到镜像)
ENV APP_ENV=${APP_ENV}
ENV DB_HOST=${DB_HOST}
ENV REDIS_PORT=${REDIS_PORT}

# 后续镜像构建步骤
COPY . /app
WORKDIR /app
ENTRYPOINT ["python", "app.py"]
  1. 调整docker-compose.yml:在build块中声明需要传递的参数
version: '3'
services:
  testproject:
    build:
      context: .
      args:
        - APP_ENV
        - DB_HOST
        - REDIS_PORT
    image: example.registry/testimage:latest
  1. 更新GitLab CI构建脚本:加载.env-dev变量并传递给构建过程
variables:
     IMAGE: "$CI_REGISTRY_IMAGE:latest"
build-image:
  stage: build
  allow_failure: false
  tags:
    - docker
  services:
    - docker:dind
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    # 将.env-dev的变量加载到当前CI shell环境
    - source .env-dev
    # 执行构建,docker-compose会自动将shell中的变量传递给Dockerfile的ARG
    - docker-compose build
    - docker-compose push

方案二:部署时通过Rancher动态传递环境变量(更灵活,推荐)

无需修改镜像,直接在部署阶段通过rancher2-gitlab-deploy工具传递变量:

方式1:逐个传递变量

deploy:
  stage: deploy
  image: kpolszewski/rancher2-gitlab-deploy
  tags:
    - docker
  script:
    - upgrade --cluster $CLUSTER --environment $ENV --stack $NAMESPACE --service $SERVICE --new-image $IMAGE 
      --env APP_ENV=prod 
      --env DB_HOST=db.example.com 
      --env REDIS_PORT=6379

方式2:批量加载.env文件变量

如果变量较多,可先将.env-dev的变量导出到CI环境,再批量传递:

deploy:
  stage: deploy
  image: kpolszewski/rancher2-gitlab-deploy
  tags:
    - docker
  script:
    # 加载.env-dev变量到当前shell
    - export $(cat .env-dev | grep -v '#' | xargs)
    # 传递变量
    - upgrade --cluster $CLUSTER --environment $ENV --stack $NAMESPACE --service $SERVICE --new-image $IMAGE 
      --env APP_ENV=$APP_ENV 
      --env DB_HOST=$DB_HOST 
      --env REDIS_PORT=$REDIS_PORT

内容的提问来源于stack exchange,提问作者user1990511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:50:30