У меня уже настроена система CI, которая создает и отправляет образы докеров в ECR. В Dockerrun.aws.json
файл Я использую эти изображения (ссылки) для запуска среды beanstalk с несколькими контейнерами докеров.
Образец Dockerrun.aws.json
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "web-app",
"host": {
"sourcePath": "/var/app/current/web-app"
}
},
{
"name": "api-service",
"host": {
"sourcePath": "/var/app/current/api-service"
}
}
],
"containerDefinitions": [
{
"name": "api-service",
"image": "somekey.dkr.ecr.us-west-2.amazonaws.com/api-service",
"essential": true,
"memory": 800,
"privileged": true,
"portMappings": [
{
"hostPort": 8080,
"containerPort": 80
}
],
"command": [
"/bin/bash",
"/root/api-service/before_run.sh"
],
"mountPoints": [
{
"sourceVolume": "api-service",
"containerPath": "/root/api-service"
}
]
},
{
"name": "web-app",
"image": "somekey.dkr.ecr.us-west-2.amazonaws.com/web-app",
"essential": true,
"memory": 800,
"environment": [
{
"name": "ENVIRONMENT",
"value": "staging"
}
],
"command": [
"/bin/bash",
"/root/web-app/before_run.sh"
],
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"mountPoints": [
{
"sourceVolume": "web-app",
"containerPath": "/root/web-app"
}
]
}
]
}
Проблема в том, что beanstalk не использует эти изображения. Вместо этого он использует код, который находится в /var/current/app/api-service
папка.
Итак, если я просто загружу Dockerrun.aws.json
файл, с которым он не работает No file or directory
так как в /var/current/app/api-service
. Аналогично, если я добавлю папку api-service
вместе с Dockerrun.aws.json
а затем развернуть. Оно работает.
Идея состоит в том, чтобы просто извлечь эти образы докеров из ECR и запустить их без развертывания дополнительного исходного кода в контейнере.
P.S: Я добавил доступ ECR к профилю экземпляра eb. И я вижу, что изображения вытягиваются правильно. Даже я могу запускать их вручную без каких-либо проблем на удаленном экземпляре.
Мне удалось с этим справиться, используя следующий подход.
удалять mountpoints
из Dockerrun.aws.json
чтобы позволить докеру использовать собственное рабочее пространство.
Итак, вот новый Dockerrun.aws.json
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [
{
"name": "api-service",
"image": "somekey.dkr.ecr.us-west-2.amazonaws.com/api-service",
"essential": true,
"memory": 800,
"privileged": true,
"portMappings": [
{
"hostPort": 8080,
"containerPort": 80
}
],
"command": [
"/bin/bash",
"/root/api-service/before_run.sh"
]
},
{
"name": "web-app",
"image": "somekey.dkr.ecr.us-west-2.amazonaws.com/web-app",
"essential": true,
"memory": 800,
"environment": [
{
"name": "ENVIRONMENT",
"value": "staging"
}
],
"command": [
"/bin/bash",
"/root/web-app/before_run.sh"
],
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
]
}
]
}