Docker-compose tagging and pushing

Not*_*bby 4 docker docker-compose

I have a few docker containers that I try to sync with docker-compose (currently are being run by bash scripts). I'm looking for a way to tag and push them to our ec2 based dockerhub (private server).

Using simply docker we did something like this (for each container):

$ docker build -f someDockerfile -t some
$ docker tag some <docker_hub_server>/some
$ docker push <docker_hub_server>/some
Run Code Online (Sandbox Code Playgroud)

I'm trying to replicate this in docker-compose. I tried a few things but this one seems close to working (but didn't work of course):

docker-compose.yml:

version: '3'
services:
  some:
    container_name:some
    image: some:<docker_hub_server>/some
Run Code Online (Sandbox Code Playgroud)

But when i run:

$ docker-compose push
Run Code Online (Sandbox Code Playgroud)

I get:

Pushing some (base:<docker_hub_server>/base:latest)...
ERROR: invalid reference format
Run Code Online (Sandbox Code Playgroud)

Any ideas on how I can tag and push my containers?

p.s.: I know that this is not the way docker-compose is meant to be used, but I also know it's possible and it fits my needs.

Abd*_*UMI 9

我在此PR中添加了该功能 ,一旦发布,您可以按如下方式使用它

docker compose tag --template "myregistry.local/myrepo/{{ .ServiceName }}:v1" --push 
Run Code Online (Sandbox Code Playgroud)

请在此处阅读有关此功能的更多信息。

如果此功能需要很长时间才能从官方存储库中发布,我们将在我们的分叉中提供它

更新

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


Eri*_*kMD 6

我已经在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
Run Code Online (Sandbox Code Playgroud)

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

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

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

.
??? build-1
?   ??? Dockerfile
?   ??? .dockerignore
??? build-2
?   ??? Dockerfile
?   ??? .dockerignore
??? docker-compose.yml
??? .gitignore
Run Code Online (Sandbox Code Playgroud)

然后在终端中执行以下操作:

$ 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
Run Code Online (Sandbox Code Playgroud)

最后,以下是一些注释,以澄清与您的问题有关的一些细节:

  • 在您的示例会话中

    $ docker build -f someDockerfile -t some .  # with "." as context build path
    $ docker tag some …/some
    $ docker push …/some
    
    Run Code Online (Sandbox Code Playgroud)

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

    $ docker build -f someDockerfile -t …/some .
    $ docker push …/some
    
    Run Code Online (Sandbox Code Playgroud)
  • 您的docker-compose.yml示例包含以下行:

    image: some:<docker_hub_server>/some
    
    Run Code Online (Sandbox Code Playgroud)

    实际上,图像标签可以包含:指定版本,但不能以这种方式指定版本(应为后缀)。例如,您可以标记图像user/some:1.0user/some:latest,并且按照惯例,后一个示例user/some:latest承认user/some为较短的等效名称。

  • 请注意,图片标记的完整语法为

    registry.name:port/user/project:version
    
    Run Code Online (Sandbox Code Playgroud)

    这里registry.name应该是域名或所需的泊坞窗注册表的主机名(如果省略,则默认为泊坞集线器)。

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

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