GitHub Actions环境变量无法传递至Docker容器的问题
容器无法获取GitHub Runner Secret环境变量的解决方法
核心原因
GitHub Runner的环境变量不会自动传递给Docker构建/运行的容器,必须通过显式配置让变量从Runner环境流入Docker进程,最终传递到容器内部。
具体解决方案
1. 确保Runner环境变量传递到Docker Compose进程
你的GitHub Actions Job已经定义了env,但需要确保执行docker compose时这些变量能被读取到。可以在执行命令前显式导出变量:
修改.github/workflows/main.yml中的部署步骤:
- name: rebuild containers run: | export PROTOCOL=${{ secrets.PROTOCOL }} export HOST=${{ secrets.HOST }} export PORT=${{ secrets.PORT }} docker compose build - name: up containers run: | export PROTOCOL=${{ secrets.PROTOCOL }} export HOST=${{ secrets.HOST }} export PORT=${{ secrets.PORT }} ./scripts/run.sh -m prod
2. 针对构建阶段的变量传递(如果Dockerfile需要)
如果你的Backend服务在构建镜像时就需要使用这些变量(比如Dockerfile中引用),需要在docker-compose.yml中配置构建参数:
更新docker-compose.yml的backend服务配置:
backend: container_name: backend build: context: ./backend args: - PROTOCOL=${PROTOCOL} - HOST=${HOST} - PORT=${PORT} restart: unless-stopped environment: - PROTOCOL=${PROTOCOL} - HOST=${HOST} - PORT=${PORT} ...
同时在Backend的Dockerfile中定义ARG并可选转为环境变量:
# 定义构建参数 ARG PROTOCOL ARG HOST ARG PORT # 如果需要在容器运行时保留这些变量,转为ENV ENV PROTOCOL=${PROTOCOL} ENV HOST=${HOST} ENV PORT=${PORT}
3. 使用.env文件统一传递变量
在GitHub Actions步骤中生成.env文件,Docker Compose会自动读取该文件填充环境变量:
在.github/workflows/main.yml中添加生成.env的步骤:
- name: generate .env file run: | echo "PROTOCOL=${{ secrets.PROTOCOL }}" > .env echo "HOST=${{ secrets.HOST }}" >> .env echo "PORT=${{ secrets.PORT }}" >> .env - name: rebuild containers run: docker compose build - name: up containers run: ./scripts/run.sh -m prod
4. 检查run.sh脚本中的Docker命令
如果你的run.sh直接使用docker run而非docker compose up,需要在命令中显式传递环境变量:
修改run.sh中的相关命令:
docker run -d \ --name backend \ -e PROTOCOL=$PROTOCOL \ -e HOST=$HOST \ -e PORT=$PORT \ backend:latest
内容的提问来源于stack exchange,提问作者Alex Lebedev
相关产品推荐
相关产品推荐

