GitHub Actions部署PHP应用到VPS:Secrets传递至Docker步骤失败
问题修复:GitHub Actions部署时Docker Run无法传递Secrets
问题本质
GitHub Actions的Secrets变量仅在Actions Runner的上下文内生效,当通过SSH连接到VPS执行命令时,远程Shell无法识别{{ secrets.XXX }}这类语法;且SSH步骤中定义的环境变量不会自动同步到远程会话,导致之前的两种尝试均失效。
可行修复方案
方案1:直接在Docker Run命令中插值传递变量
通过GitHub Actions Runner提前完成Secrets的插值,再将完整命令发送到VPS执行,核心是用双引号包裹变量确保插值生效。
修改后的SSH部署步骤示例:
- name: Deploy via SSH uses: appleboy/ssh-action@v0.1.5 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | docker run -d \ --name php-app \ -p 80:80 \ -e DB_HOST="${{ secrets.DB_HOST }}" \ -e DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \ -e APP_KEY="${{ secrets.APP_KEY }}" \ your-php-image:latest
方案2:生成.env文件后让Docker加载
适合环境变量较多的场景,先在VPS上写入包含Secrets的.env文件,再让Docker容器加载该文件。
修改后的SSH部署步骤示例:
- name: Deploy via SSH uses: appleboy/ssh-action@v0.1.5 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | # 在VPS上创建.env文件(确保路径有写入权限) cat > /var/www/php-app/.env << EOF DB_HOST=${{ secrets.DB_HOST }} DB_PASSWORD=${{ secrets.DB_PASSWORD }} APP_KEY=${{ secrets.APP_KEY }} EOF # 启动容器时加载.env文件 docker run -d \ --name php-app \ -p 80:80 \ --env-file /var/www/php-app/.env \ your-php-image:latest
原方案失效原因说明
- 直接用
{{}}语法:远程VPS的Shell无法识别GitHub Actions的模板语法,会把{{ secrets.XXX }}当作纯字符串传递给Docker,而非实际Secret值。 - SSH步骤添加环境变量:
appleboy/ssh-action的env参数仅作用于Actions Runner本地,不会同步到远程VPS的会话环境中,远程执行Docker时无法读取这些变量。
内容的提问来源于stack exchange,提问作者Dev T
相关产品推荐
相关产品推荐

