Docker-compose标记和推送

时间:2018-11-21 16:36:49

标签: docker 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中复制它。我尝试了一些方法,但是这一方法似乎很有效(但当然没有用):

  

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的使用方式,但是我也知道这是可能的,并且符合我的需求。

1 个答案:

答案 0 :(得分:3)

我已经在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。)

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

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