Наиболее распространенный способ передачи конфигурации среды в приложение, работающее в контейнере Docker, - это использовать переменную среды, предложенную в качестве третьего фактора. двенадцатифакторных приложений.
При этом ваше приложение должно считывать всю конфигурацию, включая секреты, из переменных среды.
Если вы работаете локально и вне контейнера Docker, вы можете вручную установить эти переменные среды, запустить сценарий, который экспортирует их в вашу оболочку, или использовать _ 1_ стиль помощник для вашего языка, который автоматически загружает переменные среды из файла среды и предоставляет их как переменные среды вашему приложению, чтобы вы могли их получить. с process.env.FOO
, os.environ["FOO"]
, ENV['HOSTNAME']
или каким-либо другим способом язык вашего приложения обращается к переменным среды.
При локальном запуске в контейнере Docker вы можете избежать упаковки вашего .env
файла в образ и вместо этого просто вставьте переменные среды из файла среды, используя _ 6_ аргумент docker run
или вместо этого просто вручную введите переменные среды вручную с помощью --env
.
Когда к ним просто обращаются локально, вам просто нужно убедиться, что вы не храните никаких секретов в системе управления версиями, поэтому добавьте свой .env
файл или его эквивалент к вашему .gitignore
.
Когда дело доходит до работы в CI, вам необходимо, чтобы ваша система CI надежно хранила эти секретные переменные, а затем вводила их во время выполнения. Например, в Gitlab CI переменные можно создать в настройки CI / CD проекта, это затем сохраняются в зашифрованном виде в базе данных и затем прозрачно вводятся в виде обычного текста во время выполнения в контейнер в качестве переменных среды.
Для развертывания в ECS вы можете сохранить несекретную конфигурацию напрямую как переменные среды в определении задачи. Это оставляет переменные среды доступными для чтения любому, у кого есть доступ только для чтения к вашей учетной записи AWS, что, вероятно, не то, что вам нужно для секретов. Вместо этого вы можете создать их в хранилище параметров SSM или Менеджер секретов, а затем обратитесь к ним в _ 11_ параметр определения вашей задачи:
Документация AWS включает этот небольшой пример определение задачи, которое получает секреты от менеджера секретов:
{
"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"
}
person
ydaetskcoR
schedule
08.07.2020