【问题标题】:Docker-compose tagging and pushingDocker-compose 标记和推送
【发布时间】:2022-01-18 05:12:33
【问题描述】:

我有一些 docker 容器,我尝试与 docker-compose 同步(目前由 bash 脚本运行)。我正在寻找一种方法来标记并将它们推送到我们基于 ec2 的 dockerhub(私有服务器)。

简单地使用docker 我们做了这样的事情(对于每个容器):

$ docker build -f someDockerfile -t some
$ docker tag some <docker_hub_server>/some
$ docker push <docker_hub_server>/some

我正在尝试在docker-compose 中复制它。我尝试了一些东西,但这个似乎接近工作(但当然没有工作):

docker-compose.yml:

version: '3'
services:
  some:
    container_name:some
    image: some:<docker_hub_server>/some

但是当我跑步时:

$ docker-compose push

我明白了:

Pushing some (base:<docker_hub_server>/base:latest)...
ERROR: invalid reference format

关于如何标记和推送我的容器有什么想法吗?

p.s.:我知道这不是 docker-compose 的使用方式,但我也知道这是可能的,并且符合我的需求。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    我已经使用 Docker Hub 测试了这种方法,因此您应该能够通过以下配置和 shell 会话来实现您想要的:

    docker-compose.yml

    version: '3'
    services:
      build-1:
        build:
          context: ./build-1
        image: user/project-1
      build-2:
        build:
          context: ./build-2
        image: user/project-2
    

    (在这里,如果您使用的不是 Docker Hub 而是另一个 Docker 注册表,则应将 user/project-1 替换为 registry.name/user/project-1,例如,quay.io/user/project-1。)

    此处涉及的各个字段(build:context: 等)在this page of the docker-compose documentation 中进行了描述。

    上面的docker-compose.yml 文件假定您有以下树(包括.gitignore 和一些.dockerignore 文件,以符合最佳做法):

    .
    ├── build-1
    │   ├── Dockerfile
    │   └── .dockerignore
    ├── build-2
    │   ├── Dockerfile
    │   └── .dockerignore
    ├── docker-compose.yml
    └── .gitignore
    

    然后在终端中执行:

    $ docker login
      # → append the domain name of your Docker registry
      #   if you are not using Docker Hub; for example:
      # docker login quay.io
    $ docker-compose build --pull
    $ docker-compose push
      # and optionally:
    $ docker logout
    

    最后,以下是一些说明,以澄清与您的问题相关的一些细节:

    • 在您的示例会话中

      $ docker build -f someDockerfile -t some .  # with "." as context build path
      $ docker tag some …/some
      $ docker push …/some
      

      some 是一个临时图像名称(不是容器),因此似乎没有必要:您也可以运行以下命令,得到相同的结果。

      $ docker build -f someDockerfile -t …/some .
      $ docker push …/some
      
    • 您的 docker-compose.yml 示例包含以下行:

      image: some:<docker_hub_server>/some
      

      其实图片标签可以包含:来指定版本,但不能这样(应该是后缀)。例如,您可以标记图像user/some:1.0user/some:latest,按照惯例,后一个示例user/some:latest 承认user/some 是一个较短的等效名称。

    • 请注意,图像标签的完整语法是

      registry.name:port/user/project:version
      

      其中registry.name 应该是所需 Docker 注册表的域名或主机名(如果省略,则默认为 Docker Hub)。

      that page of the official documentation 中提到了这一点。

      例如,如果您使用 Quay Docker 注册表,图像标签可以是 quay.io/user/some:latest 或更简洁的 quay.io/user/some

    【讨论】:

    • 所有这些命令都使用 docker 来构建和推送。我可以使用 docker-compose 一次推送所有容器吗?
    • 当然:您可以使用docker-compose builddocker-compose push 构建和推送docker-compose.yml 中指定的图像,参见。 docs.docker.com/compose/reference/push
    • 这对我不起作用。如何将本地构建的所有 docker 推送到
    • @NotSoShabby 好的,所以我做了一些实验,它对我有用。我重构了我的答案以添加更多详细信息(关于.yml、要运行的命令和图像标签命名约定)。希望这会有所帮助。
    • 哇这个提示“有些是临时图像名称(不是容器),所以看起来没有必要”改变了我的想法!我自己怎么想不到这么明显?当然删除“标签”步骤很简单!!谢谢。
    【解决方案2】:

    我在PR 中添加了该功能 一旦它发布,你可以使用它如下

    docker compose tag --template "myregistry.local/myrepo/{{ .ServiceName }}:v1" --push 
    

    阅读更多关于此功能的信息here

    如果此功能需要很长时间才能从官方仓库中发布,我们将在our fork 中提供它

    更新

    在我们的分叉中发布:https://github.com/ElmCompany/compose/releases/tag/v2.2.3-2

    【讨论】:

    • 我对你的 PR 投了赞成票,希望很快就会成功
    • 好吧@NotSoShabby。我们很快就会发布它。只是我们需要检查 CI 失败的原因
    • 好的!恭喜?! github.com/ElmCompany/compose/releases/tag/v2.2.3-2 仅供参考 @NotSoShabby 和投票的人!
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多