将环境特定配置传递给在 Docker 容器中运行的应用程序的最常见方法是使用环境变量,正如Twelve-Factor Apps 的第三个因素所提出的那样。
有了这个,您的应用程序应该从环境变量中读取所有配置,包括秘密。
如果您在本地和 Docker 容器外部运行,您可以手动设置这些环境变量,运行将它们导出到 shell 的脚本或使用您的语言的样式助手,该助手将自动从环境文件加载环境变量并将它们公开为环境变量到您的应用程序,以便您可以使用 、 获取它们,或者您的应用程序的语言访问环境变量。dotenv
process.env.FOO
os.environ["FOO"]
ENV['HOSTNAME']
在本地 Docker 容器中运行时,您可以避免将.env
文件打包到映像中,而只需使用--env-file
to 参数docker run
从环境文件中注入环境变量,或者只需手动使用--env
.
当这些只是在本地访问时,您只需要确保您没有在源代码管理中存储任何机密,以便将您的.env
文件或等效文件添加到您的.gitignore
.
在 CI 中运行时,您需要让 CI 系统安全地存储这些秘密变量,然后在运行时注入它们。例如,在Gitlab CI中,您将在项目 CI/CD 设置中创建变量,然后将这些变量加密存储在数据库中,然后在运行时以纯文本形式透明地注入容器作为环境变量。
对于部署到 ECS,您可以将非机密配置直接存储为任务定义中的环境变量。这使得对您的 AWS 账户具有只读访问权限的任何人都可以读取环境变量,这可能不是您想要的秘密。相反,您可以在SSM Parameter Store或Secrets Manager中创建这些,然后在secrets
任务定义的参数中引用这些:
AWS 文档包含这个从 Secrets Manager 获取机密的任务定义的小示例:
{
"requiresCompatibilities": [
"EC2"
],
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "web",
"image": "httpd",
"memory": 128,
"essential": true,
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "splunk",
"options": {
"splunk-url": "https://sample.splunk.com:8080"
},
"secretOptions": [
{
"name": "splunk-token",
"valueFrom": "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter"
}
]
},
"secrets": [
{
"name": "DATABASE_PASSWORD",
"valueFrom": "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter"
}
]
}
],
"executionRoleArn": "arn:aws:iam::awsExampleAccountID:role/awsExampleRoleName"
}