【问题标题】:docker-compose push image to aws ecrdocker-compose 将图像推送到 aws ecr
【发布时间】:2021-04-24 04:46:26
【问题描述】:

是否可以让 docker-compose 构建一个镜像并将其推送到远程仓库?现在我做

docker-compose

构建然后我做

docker-compose config --services

遍历名称重建图像名称和标签,然后执行

docker push blah

似乎必须有一种方法可以要求它也推动。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    首先,您需要使用aws ecr get-login-password 命令为 AWS ECR 生成登录信息。在 bash 中我做到了:

    $ eval $(aws ecr get-login-password)
    

    那么对于每个镜像,ecr 要求你在推送镜像之前创建一个仓库。

    在我的 docker-compose.yml 文件中,我有一系列服务:

    version: '3'
    services:
      scheduler:
        image: ${DOCKER_REGISTRY}/pipeline_scheduler
        build:
          context: ../
          dockerfile: ./docker/scheduler/Dockerfile
       startup:
         image: ${DOCKER_REGISTRY}/pipeline_setup
         build:
           context: ../
           dockerfile: ./docker/startup/Dockerfile
        # etc...
    

    在我的 .env 文件中,我将 DOCKER_REGISTRY 设置为亚马逊注册表位置:

    DOCKER_REGISTRY=919057965832.dkr.ecr.us-east-1.amazonaws.com
    

    在 ecr 中创建存储库(再次使用 bash):

    $ for r in $(grep 'image: \${DOCKER_REGISTRY}' docker-compose.yml | sed -e 's/^.*\///')
    > do
    >  aws ecr create-repository --repository-name "$r"
    > done
    

    (输出将显示包括帐户和区域在内的注册表信息,因此您可以根据需要检查/设置您的 .env 文件)。

    然后你就可以用通常的方式构建和推送镜像了:

    $ docker-compose build
    $ docker-compose push
     
    

    【讨论】:

    • 似乎get-login 现在已弃用,应替换为get-login-password。我一直在我的脚本中使用eval $(aws ecr get-login-password --region <region>)
    • 这可能非常适合构建,但是当 deploying to ECR with the Compose API 时,当 AWSCLI 尝试将 docker-compose 文件转换为 CloudFormation 时,它不会解析 ${DOCKER_REGISTRY} env var 并导致 @ 987654332@.
    • 如果您是像我这样的 Windows 用户并且需要 repo 名称来在 ECR 中创建存储库,请创建 .bat 文件并粘贴以下代码并运行它:FOR /F "delims=/ tokens=1*" %%A IN ('docker images 123.dkr.ecr.ca-region.amazonaws.com/* --format "{{.Repository}}"') DO ( echo %%B aws ecr create-repository --repository-name %%B ) PAUSE
    【解决方案2】:

    https://docs.docker.com/compose/compose-file/compose-file-v3/#build 的文档中查看这个 sn-p:

    如果您指定图像和构建,则 Compose 命名构建 带有 webapp 和 image 中指定的可选标签的图像:

    build: ./dir
    image: webapp:tag
    

    这将产生一个名为 webapp 和 tagged 标签,由 ./dir 构建。

    您至少可以在图像名称中添加图像存储库。然后你应该可以使用docker-compose push 与较新版本的 Docker Compose。

    【讨论】:

    • 是的,这基本上就是我正在做的事情。但是因为我的 compose 创建了几个图像,所以我必须循环这些服务的名称来创建要创建的图像的名称,然后重用该名称来推送。我希望 docker-compose,因为它已经知道图像的名称,并且我拥有的所有服务都可以为我做这件事。
    • 您能否在问题中概述为什么docs.docker.com/compose/reference/push 不起作用或涉及的其他步骤?我不清楚你在问什么。
    • 啊,我希望有人能提出来。原因是,我好像没有。我的 docker-compose 版本是 1.7.1,但是当我执行 --help 时,它没有列出 push in there。我不知道我是否需要一个实验版本或什么。然后我不知道这是否正是它所做的,但如果是这样那就太棒了
    • 1.7 已经很老了。它是如何安装的?你能升级吗?
    • 是吗?该死的,是的,是的,是的,正如我上面所问的那样,push 是有效的。我想如果你想写一个新的答案说“使用 push dummy”,我会选择它为正确的
    猜你喜欢
    • 2020-02-13
    • 2021-07-27
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2019-07-24
    • 2019-02-23
    相关资源
    最近更新 更多