Docker Compose构建自定义镜像传参时提示拉取访问被拒
问题根因
首次执行docker-compose up -d时,Docker Compose默认不会自动识别跨服务的本地镜像依赖顺序:
- 构建cm服务时,其Dockerfile通过构建参数
MY_TOOLS引用mytools作为基础镜像,Compose会优先尝试从远程镜像仓库拉取该镜像,不会等待本地tools服务的构建任务完成 - 由于
mytools是你本地自定义构建的镜像,从未推送到任何可访问的远程仓库,远程拉取请求直接触发权限拒绝报错,也就是你看到的pull access denied提示 - 首次执行流程虽然整体报错,但tools服务的
mytools镜像实际已经在本地构建完成,第二次执行docker-compose up时Compose能直接在本地找到该镜像,不需要发起远程拉取,因此可以正常运行。
注:报错信息中提到的lvtools属于配置拼写误差,可自行排查是否存在变量或镜像名写错的情况。
修复方案
不需要拆分多个Compose配置文件,在现有单文件内补充两项配置即可解决首次构建失败的问题:
- 给cm服务显式声明对tools服务的依赖,强制Compose先完成tools服务的构建,再启动cm服务的构建流程
- 给cm服务配置构建时不拉取远程镜像的规则,避免对本地自定义的
mytools镜像发起无效的远程拉取请求
调整后的服务配置如下:
tools: image: mytools build: context: ./docker/build/mytools args: BASE_IMAGE: ${SOLUTION_BASE_IMAGE} cm: image: ${REGISTRY}${COMPOSE_PROJECT_NAME}-xm1-cm:${VERSION:-latest} depends_on: tools: condition: service_completed_successfully build: context: ./docker/build/cm pull_policy: never args: MY_TOOLS: mytools
验证方法
修改配置后,先清理本地旧的构建缓存,再执行启动命令即可验证首次构建正常:
# 停止现有容器,删除本地构建的自定义镜像 docker-compose down --rmi local # 重新启动,首次执行即可正常完成构建,不会出现拉取权限报错 docker-compose up -d
内容的提问来源于stack exchange,提问作者Richard Banks
相关产品推荐
相关产品推荐

