Docker Compose使用buildx缓存时/buildx_buildkit容器名称冲突问题
解决Docker Compose并行构建时buildx容器名称冲突问题
背景
我维护的Docker Compose配置包含多个服务,这些服务镜像体积较大,每次从仓库拉取都会大幅增加CI流水线的耗时。为缩短构建和启动时间,我给多个服务配置了cache-from和cache-to参数,而这些缓存功能依赖于docker buildx。
问题
执行docker compose build时,buildx会并行执行多个服务的构建任务,此时出现了/buildx_buildkit_*格式的容器名称冲突错误,具体报错如下:
> [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.
解决方案
- 升级DinD镜像版本:此前CI/CD流水线使用的是
docker:20.10.16-dind镜像,必须替换为最新版的docker:dind镜像,该版本修复了并行构建时的容器命名冲突问题。
配置示例
DinD服务配置(dind.yml)
version: '3.9' services: dind: image: docker:dind privileged: true restart: always volumes: - /dockerbuild:/build/dockerbuild
Docker Compose配置(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
基础Dockerfile
FROM alpine:latest CMD ["/bin/sh"]
出错的GitLab CI脚本片段
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.
内容的提问来源于stack exchange,提问作者til
相关产品推荐
相关产品推荐

