簡體   English   中英

如何在 AWS CDK 中為 Python 覆蓋 aws_cdk.core.LegacyStackSynthesizer.add_docker_image_asset

[英]How to override aws_cdk.core.LegacyStackSynthesizer.add_docker_image_asset in AWS CDK for Python

我想將 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>"
  }
}

如果您想進一步更改存儲庫(我喜歡讓它完全托管,但是嘿),您可以使用aws_ecr.Repository構造上的 static 方法之一將存儲庫加載到 CDK 堆棧中。 https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecr.Repository.html#static-from-wbr-repository-wbr-namescope-id-repositoryname

希望這有所幫助:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM