Docker:导出镜像失败:创建镜像失败:获取层失败

Lew*_*wik 13 docker dockerfile

我收到以下错误:

无法导出图像:无法创建图像:无法获取图层 sha256:xxxxxxxxxxxxx:图层不存在

Dockerfile

FROM openjdk:8
COPY ./lib/ /usr/src/app/BOOT-INF/lib/
COPY ./lib/entities-1.0-SNAPSHOT.jar /usr/src/app/BOOT-INF/lib/entities-1.0-SNAPSHOT.jar
COPY ./app/ /usr/src/app/
WORKDIR /usr/src
CMD ["java", "-cp", "app/", "org.springframework.boot.loader.JarLauncher"]
Run Code Online (Sandbox Code Playgroud)

输出

Step 3/6 : COPY ./lib/entities-1.0-SNAPSHOT.jar /usr/src/entities-1.0-SNAPSHOT.jar
 ---> 3acb1f6c911a
Step 4/6 : COPY ./app.jar /usr/src/app.jar
failed to export image: failed to create image: failed to get layer sha256:33a94c44f7804ae3f57b9e72f94323c15cef7267be7eb95d90d2a1673c4b33b9: layer does not exist
Run Code Online (Sandbox Code Playgroud)

第二次运行总是有帮助 - 错误消失。我正在构建多个不同的图像(不同的 jar),在不同的目录中使用不同的 Dockerfile。但是 Dockerfiles 的内容是一样的。

我认为添加后出现此错误:

COPY ./lib/entities-1.0-SNAPSHOT.jar /usr/src/app/BOOT-INF/lib/entities-1.0-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

我不想删除那一行:app 和实体是我的库。如果我删除行 - 我将得到一个第三方库(50mb)与实体(2mb)合并的层。

veb*_*ben 21

COPY多阶段构建中的特定命令序列会出现此问题。

更准确地说,当有一条COPY指令产生空效果时(例如,如果复制的内容已经存在于目标中,并且 0 diff),则触发错误,然后紧跟另一COPY条指令。

解决方法可能是RUN trueCOPY语句之间添加:

COPY ./lib/ /usr/src/app/BOOT-INF/lib/
RUN true
COPY ./lib/entities-1.0-SNAPSHOT.jar /usr/src/app/BOOT-INF/lib/entities-1.0-SNAPSHOT.jar
RUN true
COPY ./app/ /usr/src/app/
Run Code Online (Sandbox Code Playgroud)

另一种似乎有效的方法是使用 启动构建BUILDKIT,如下所示:

DOCKER_BUILDKIT=1 docker build --tag app:test .
Run Code Online (Sandbox Code Playgroud)

见:https : //github.com/moby/moby/issues/37965

  • 你能解释一下为什么“RUN true”有效吗?显然它对我有用。 (7认同)
  • DOCKER_BUILDKIT=1 有效。如果有人能解释为什么它有效,以及我们是否应该一直使用这个标志,那就太好了 (2认同)

Cry*_*ptc -2

我收到此错误,但它没有告诉我任何信息。如果您希望它输出实际错误,请使用以下命令:

docker-compose -f "docker-compose.yml" up --remove-orphans --force-recreate' <optional service: e.g. "nginx">
Run Code Online (Sandbox Code Playgroud)

从:

错误:服务“nginx”构建失败:导出图像失败:创建图像失败:无法获取层 sha256:63d3...:层不存在

到:

创建project_nginx ...完成
附加到project_nginx
nginx_1 | 2019/06/12 03:27:30 [紧急] 1#1:BIO_new_file(“/etc/ssl/certs/dhparam.pem”)失败(SSL:错误:02001002:系统库:fopen:没有这样的文件或目录:fopen('/etc/ssl/certs/dhparam.pem','r')错误:2006D080:BIO例程:BIO_new_file:没有这样的文件)

从那里我可以找到实际的问题。但是,从最初的错误中,您无法知道到底是什么导致了失败。