Dockerfile添加阶段名称时提示仓库未找到问题求助
问题原因与解决方案
你的问题核心在于Docker版本太旧,不支持你用的多阶段构建语法。
为什么会报错?
AS builder这种为构建阶段命名的语法,是Docker在17.05版本才正式引入的多阶段构建特性。而你当前使用的Docker v1.6.2是非常老旧的版本(2015年发布),完全不认识这个语法——它会把sgrio/java-oracle:jdk_8 AS builder整个字符串当成镜像名称去拉取,自然会提示“仓库找不到”。
两种解决办法
1. 升级Docker版本(推荐)
这是最直接的解决方案,升级到17.05或更高版本后,就能正常使用AS builder的语法了。针对Ubuntu 14.04.5 LTS,你可以按照以下步骤操作:
- 先卸载旧版本:
sudo apt-get remove docker docker-engine docker.io - 设置Docker官方软件源:
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - 安装新版本Docker:
sudo apt-get update sudo apt-get install docker-ce
安装完成后,运行docker --version确认版本已经升级,再重新执行docker build就不会报错了。
2. 不升级版本,用旧方式实现类似效果
如果暂时无法升级Docker,你可以拆分构建流程:
- 第一步,创建一个只包含builder阶段的临时Dockerfile(比如命名为
Dockerfile.builder),内容如下:FROM sgrio/java-oracle:jdk_8 # 这里放你原本在builder阶段要执行的构建命令,比如编译代码、打包文件等 - 构建这个临时镜像并运行一个容器:
sudo docker build -t my-builder -f Dockerfile.builder . sudo docker create --name temp-container my-builder - 将builder阶段生成的文件复制到本地:
sudo docker cp temp-container:/path/to/built/files ./local-output - 最后,在你的主Dockerfile里,从基础镜像开始,将本地复制出来的文件COPY进去,完成后续构建。
这种方式虽然能实现需求,但操作繁琐,不如升级Docker版本来得方便。
内容的提问来源于stack exchange,提问作者Terje Mikal
相关产品推荐
相关产品推荐

