如何解决GitHub Action中S3输出传递到EC2容器变量为空的问题
问题排查与解决步骤
第一步:先确认GitHub Action的输出是否正常
在Updating EC2 [Develop] instance步骤前加个调试步骤,验证s3动作的输出值是否正确生成:
- name: 调试S3输出值 run: | echo "user_id: ${{steps.s3.outputs.user_id}}" echo "user_key: ${{steps.s3.outputs.user_key}}"
如果这一步输出为空,说明s3-actions的输出有问题:
- 检查
generate_keys函数里的$USER变量是否有值:函数里执行aws iam create-access-key --user-name $USER,如果$USER为空,创建密钥会直接失败,导致输出为空。你需要在Building S3 Instance步骤的env里添加USER: '你的IAM用户名',否则这个变量是空的。
第二步:把EC2宿主机的变量传给容器
如果第一步验证输出正常,那问题就是宿主机的变量没传递到容器里,有几种解决方式:
方式1:在docker-compose.yml里配置引用宿主机变量
修改你的docker-compose.yml,给需要这些变量的服务加environment配置:
services: 你的服务名: # ...其他配置 environment: - BUCKET_USER=${BUCKET_USER} - BUCKET_USER_KEY=${BUCKET_USER_KEY}
这样docker-compose启动时会自动读取宿主机的这两个变量,传给容器。
方式2:启动容器时直接传变量
在ssh-action的script里,启动命令直接带变量:
docker-compose up -d -e BUCKET_USER=$BUCKET_USER -e BUCKET_USER_KEY=$BUCKET_USER_KEY
如果是指定服务,就加上服务名:
docker-compose up -d 你的服务名 -e BUCKET_USER=$BUCKET_USER -e BUCKET_USER_KEY=$BUCKET_USER_KEY
方式3:临时生成.env文件
在ssh-action的script里,先把变量写入.env文件,再启动docker-compose:
cd ~/devdir export BUCKET_USER=${{steps.s3.outputs.user_id}} export BUCKET_USER_KEY=${{steps.s3.outputs.user_key}} # 写入.env文件 echo "BUCKET_USER=$BUCKET_USER" >> .env echo "BUCKET_USER_KEY=$BUCKET_USER_KEY" >> .env # 后续命令不变 docker login docker-compose down --remove-orphans docker system prune -a -f docker pull yyyy docker-compose up -d
docker-compose默认会读取当前目录的.env文件,容器就能拿到这些变量。
第三步:验证容器内变量是否生效
启动容器后,可以在ssh-action的script末尾加命令验证:
# 查看容器内变量 docker exec 你的容器名 env | grep BUCKET_ # 或者直接打印变量值 docker exec 你的容器名 echo "BUCKET_USER: \$BUCKET_USER"
内容的提问来源于stack exchange,提问作者Carlos Gonzalez
相关产品推荐
相关产品推荐

