运行时如何通过docker run将JSON格式环境变量传入Docker容器?
解决Docker加载JSON格式Google服务凭据的环境变量错误
错误根源
Docker的--env-file对包含换行、空格的变量值解析规则严格,你当前.env文件用单引号包裹多行JSON的写法,会让Docker把换行后的内容识别为新变量,触发“variable contains whitespaces”错误。
两种可行修复方案
方案1:将JSON压缩为单行并正确包裹
把整个服务凭据JSON压缩成无换行的单行,然后在.env文件中用单引号包裹(单引号会原样保留内部内容,无需转义双引号):
GOOGLE_APPLICATION_CREDENTIALS='{"type": "service_account","project_id": "","private_key_id": "","private_key": "","client_email": "","client_id": "","auth_uri": "https://accounts.google.com/o/oauth2/auth","token_uri": "https://oauth2.googleapis.com/token","auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url": "","universe_domain": "googleapis.com"}'
如果私钥字段包含换行符,要替换为\n转义字符(比如原私钥的-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----需保留\n)。
方案2:直接在docker run命令中传递变量
跳过.env文件,用-e参数直接传递压缩后的JSON:
docker run -it --rm -e GOOGLE_APPLICATION_CREDENTIALS='{"type": "service_account","project_id": "","private_key_id": "","private_key": "","client_email": "","client_id": "","auth_uri": "https://accounts.google.com/o/oauth2/auth","token_uri": "https://oauth2.googleapis.com/token","auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url": "","universe_domain": "googleapis.com"}' test-file
也可以直接读取本地.env文件的内容(需确保.env中变量值是正确的单行格式):
docker run -it --rm -e GOOGLE_APPLICATION_CREDENTIALS="$(grep GOOGLE_APPLICATION_CREDENTIALS .env | cut -d'=' -f2- | sed "s/^'//;s/'$//")" test-file
部署到Railway的注意事项
推送容器到Railway时,无需处理本地.env文件,直接在Railway控制台的环境变量面板中粘贴完整的多行JSON凭据即可——Railway原生支持多行环境变量的解析。
内容的提问来源于stack exchange,提问作者Ryan Prentiss
相关产品推荐
相关产品推荐

