gpt4 book ai didi

python - 如何在适用于 Python 的 AWS CDK 中覆盖 aws_cdk.core.LegacyStackSynthesizer.add_docker_image_asset

转载 作者:行者123 更新时间:2023-12-02 19:16:36 26 4
gpt4 key购买 nike

我想将本地磁盘中的 docker 镜像上传到我使用 AWS CDK 创建的存储库。
当我使用 aws_ecr_assets.DockerImageAsset 将 Docker 镜像添加到存储库时(除了我无法通过 CDK 在其存储库上设置权限之外,它工作正常),我收到以下弃用警告:

DockerImageAsset.repositoryName is deprecated. Override "core.Stack.addDockerImageAsset" to control asset locations
在查看 core.Stack.addDockerImageAsset 时,我得到一个提示,我应该覆盖 stack.synthesizer.addDockerImageAsset()
我的带有自定义合成器的简化堆栈如下所示:
class CustomSynthesizer(core.LegacyStackSynthesizer):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def add_docker_image_asset(
self,
*,
directory_name,
source_hash,
docker_build_args=None,
docker_build_target=None,
docker_file=None,
repository_name=None,
):
# What should I put in this function to upload the docker image into my repository?


class ContainerStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:

super().__init__(scope, id, synthesizer=CustomSynthesizer(), **kwargs)

repo = ecr.Repository(self, "TestRepo", repository_name="test_repo")
repo.grant_pull(iam.AccountPrincipal("123456789123"))

image_location = self.synthesizer.add_docker_image_asset(
directory_name="path/to/dir/with/Dockerfile",
source_hash="latest",
repository_name=repo.repository_name,
)
我尝试的另一件事是使用标准堆栈合成器并在其上调用 add_docker_image_asset。不幸的是,我收到以下错误消息并且堆栈无法部署:
test-stack: deploying...
[0%] start: Publishing latest:current
[25%] fail: Unable to execute 'docker' in order to build a container asset. Please install 'docker' and try again.
...
❌ test-stack failed: Error: Failed to publish one or more assets. See the error messages above for more information.
at Object.publishAssets (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/util/asset-publishing.ts:25:11)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at Object.deployStack (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/api/deploy-stack.ts:216:3)
at CdkToolkit.deploy (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:181:24)
at main (/home/user/.npm-global/lib/node_modules/aws-cdk/bin/cdk.ts:268:16)
at initCommandLine (/home/user/.npm-global/lib/node_modules/aws-cdk/bin/cdk.ts:188:9)
Failed to publish one or more assets. See the error messages above for more information.
对于如何解决这个问题,我很满意,非常感谢任何帮助!

最佳答案

DockerImageAsset是一个托管结构,它自己处理存储库和版本控制。默认情况下,它为您的堆栈创建一个存储库并将您的 docker 图像上传到它(通过它们的哈希标记它们)。
您无需自己创建此存储库。但是,如果你和我一样,想给仓库起一个清晰的名字,你可以使用 cdk.json 来命名仓库。配置文件及其 context部分:

// cdk.json
{
"app": "python3 your_app",
"context": {
"@aws-cdk/core:enableStackNameDuplicates": "true",
"aws-cdk:enableDiffNoFail": "true",
"assets-ecr-repository-name": "<REPO NAME GOES HERE>"
}
}
如果你想进一步修改 repo(我喜欢让它完全管理,但是嘿),你可以使用 aws_ecr.Repository 上的静态方法之一将 repo 加载到 CDK 堆栈中。构造。
https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecr.Repository.html#static-from-wbr-repository-wbr-namescope-id-repositoryname
希望这有所帮助 :-)

关于python - 如何在适用于 Python 的 AWS CDK 中覆盖 aws_cdk.core.LegacyStackSynthesizer.add_docker_image_asset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63230559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com