首页 > 解决方案 > Docker-compose 标记和推送

问题描述

我有一些尝试与之同步的 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. 我尝试了一些事情,但这个似乎接近工作(但当然没有工作):

码头工人-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

关于如何标记和推送容器的任何想法?

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

标签: dockerdocker-compose

解决方案


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

码头工人-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-1quay.io/user/project-1

此处涉及的各个字段(build:context:等)在docker-compose 文档的此页面中进行了描述。

上面的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
    

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

    官方文档的那个页面中提到了这一点。

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


推荐阅读