docker compose / cache-from cache-to / buildx: 容器名称 /buildx_buildkit 已在使用中

til*_*til 6 docker docker-compose buildx

动机
我有一个 docker compose,它有几个服务,这些服务可能非常大,由于从注册表加载,它们会显着影响 ci 时间。
为了减少构建和启动时间,我对许多服务使用 --cache-to 和 --cache-from 。

使用缓存需要 docker buildx。

问题
docker compose build会导致 buildx 的并行执行和容器名称“/buildx_buildkit_*”的名称冲突

滚动浏览“解决方案”部分以查看我正在使用的文件以及底部的错误消息

解决方案
请参阅fbjorn 的回答
另请注意以下事项:在撰写本文时,图像通常docker:20.10.16-dind用于 CICD dind 管道。为了使这个场景发挥作用,我必须使用 docker:dind (即最新的 dind)

# dind.yml
version: '3.9'

services:
  dind:
    image: docker:dind
    privileged: true
    restart: always
    volumes:
      - /dockerbuild:/build/dockerbuild
Run Code Online (Sandbox Code Playgroud)
# docker-compose.yml
version: '3.9'

services:
  my_service:
    build:
      context: .
      cache_from:
        - type=local,src=./${CACHE_DIR:-build-cache}/my_service
      cache_to:
        - type=local,dest=./${CACHE_DIR:-build-cache}/my_service
      dockerfile: Dockerfile
    image: ${MY_IMAGE_TAG:-dockerbuild:latest}
    command: tail -f /dev/null
    
  your_service:
    build:
      context: .
      cache_from:
        - type=local,src=./${CACHE_DIR:-build-cache}/your_service
      cache_to:
        - type=local,dest=./${CACHE_DIR:-build-cache}/your_service
      dockerfile: Dockerfile
    image: ${MY_IMAGE_TAG:-dockerbuild:latest}
    command: tail -f /dev/null
    
  # sqlserver:
  #   build: 
  #     context: ./Dockerfile_sqlserver
  #     cache_from:
  #       - type=local,src=./${CACHE_DIR:-build-cache}/mssql
  #     cache_to:
  #       - type=local,dest=./${CACHE_DIR:-build-cache}/mssql
  #   image: mcr.microsoft.com/mssql/server:2019-CU19-ubuntu-20.04
    
Run Code Online (Sandbox Code Playgroud)
# Dockerfile
FROM alpine:latest

CMD ["/bin/sh"]
Run Code Online (Sandbox Code Playgroud)
# snippet from gitlab-ci - I'm running these commands in the dind container.
script:
    - cd /build/dockerbuild
    - docker buildx create --use --name my_builder_1 
      # my_builder_1
    - docker compose build
      # /build/dockerbuild # docker compose build
      # [+] Building 38.4s (2/2) FINISHED
      #  => CANCELED [your_service internal] booting buildkit
      #  => => pulling image moby/buildkit:buildx-stable-1
      #  => => creating container buildx_buildkit_my_builder_10
      #  => ERROR [my_service internal] booting buildkit
      #  => => pulling image moby/buildkit:buildx-stable-1
      #  => => creating container buildx_buildkit_my_builder_10  s
      # ------
      #  > [my_service internal] booting buildkit:
      # ------
      # Error response from daemon: Conflict. The container name "/buildx_buildkit_my_builder_10" is already in use by container "...". 
      # You have to remove (or rename) that container to be able to reuse that name.
Run Code Online (Sandbox Code Playgroud)

use*_*314 5

我通过在一个图像中构建多个图像来面临类似的问题。还说The container name "/buildx_buildkit_*" is already in use by container <..>

我的解决方案是在创建构建器时通过附加标志来引导构建器--bootstrap。尝试将命令更改为:

docker buildx create --use --bootstrap --name my_builder_1 
Run Code Online (Sandbox Code Playgroud)

然后您的构建命令将不会尝试引导容器,因为它已经完成了。