这可能是由于CDK在执行创建ECS任务时尝试从ECR中拉取镜像,但由于权限或身份验证问题而无法成功执行。为了解决此问题,可以通过CDK的“dockerImageAsset”函数将不同的容器镜像打包并存储在S3存储桶中,然后在部署中引用该存储桶路径。
以下是示例CDK代码:
from aws_cdk import (
aws_ecs as ecs,
aws_ecr_assets as ecr_assets,
core
)
class MyECSStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs):
super().__init__(scope, id, **kwargs)
# 定义存储桶及容器镜像所在路径
image_bucket = 'my-image-bucket'
image_key = 'my-image:latest'
# 创建存储桶并上传容器镜像
image_asset = ecr_assets.DockerImageAsset(
self, 'MyImageAsset',
directory='./path/to/Dockerfile',
repository_name='my-image',
build_args = {'arg1': 'value1', 'arg2': 'value2'},
)
# 在EC2容器实例定义任务时引用S3存储桶中的容器镜像路径
task = ecs.TaskDefinition(
self, "MyTask",
family="my-task",
network_mode=ecs.NetworkMode.AWS_VPC,
cpu='256',
memory_mib='1024'
)
container = task.add_container(
'MyContainer',
image=ecs.ContainerImage.from_asset(f'{image_bucket}/{image_key}'), # 引用S3存储桶路径
memory_reservation_mib=1024,
essential=True,
logging=ecs.LogDriver.aws_logs(
stream_prefix='my-logs',
log_retention=logs.RetentionDays.ONE_WEEK,
)
)
# 创建ECS服务并引用任务及集群
service = ecs.Ec2Service(
self, 'MyService',
cluster=cluster,
task_definition=task,
deployment_controller=ecs.DeploymentController(type=ecs.DeploymentControllerType.CODE_DEPLOY),
desired_count=1,
min_healthy_percent=0,
max_healthy_percent=100,
)
该示例代码创建了一个S3存储桶并将容器镜