Docker运行报错:layer不存在



我试图在我的树莓派3上使用docker-compose设置redmine(与postgres)。它已经工作了一次,但后来我试图安装插件,不知何故设法破坏了我的系统。

现在它不再让我启动数据库容器了。即使创建一个新的postgres:12.8容器,也会产生错误layer does not exist:

$ docker run --rm -it postgres:12.8 bash
docker: Error response from daemon: layer does not exist.

我已经重新启动了系统两次,遗憾的是没有改变任何东西。我怎样才能让它再次工作?

额外的信息:

$ docker info
Client:
Debug Mode: false
Server:
Containers: 5
Running: 4
Paused: 0
Stopped: 1
Images: 65
Server Version: 19.03.13
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.19.66-v7+
Operating System: Raspbian GNU/Linux 9 (stretch)
OSType: linux
Architecture: armv7l
CPUs: 4
Total Memory: 926.1MiB
Name: raspberrypi
ID: <redacted>
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
WARNING: No cpu cfs quota support
WARNING: No cpu cfs period support
更新1:

删除图像(通过docker rmi)不能停止错误。

$ docker run --rm -it postgres:12.8 bash
Unable to find image 'postgres:12.8' locally
12.8: Pulling from library/postgres
Digest: sha256:e10cd754296c1b3e93a121bcc64550d183df56f20bab47e08cacb123fb969b5e
Status: Downloaded newer image for postgres:12.8
docker: Error response from daemon: layer does not exist.
See 'docker run --help'.

其他图像可以正常运行:

$ docker run --rm -it alpine bash
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
4ee0caa23b36: Pull complete
Digest: sha256:eb3e4e175ba6d212ba1d6e04fc0782916c08e1c9d7b45892e9796141b1d379ae
Status: Downloaded newer image for alpine:latest
/ # whoami
root
/ #

Nuking/var/lib/docker似乎使系统再次工作-这将删除所有图像和许多其他与docker相关的数据。

这感觉不像是一个很好的解决方案,但现在必须这样做。

$ sudo service docker stop
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
$ sudo rm -rf /var/lib/docker
$ sudo service docker start
$ docker run --rm -it postgres:12.8 bash
Unable to find image 'postgres:12.8' locally
12.8: Pulling from library/postgres
607f77084e8a: Pull complete
ce89a6184ac9: Pull complete
2a4e6e7ac863: Pull complete
f3b6f439172b: Pull complete
2e803a3461b4: Pull complete
467430f26cab: Pull complete
1a81afc37621: Pull complete
4ceea61b7b5c: Pull complete
1f5bfa96a004: Pull complete
b40859b8e537: Pull complete
c7b3bf3cab26: Pull complete
653c63793cd5: Pull complete
aad7328542d8: Pull complete
Digest: sha256:e10cd754296c1b3e93a121bcc64550d183df56f20bab47e08cacb123fb969b5e
Status: Downloaded newer image for postgres:12.8
root@8ba418515688:/# 

引用:

  • https://github.com/coreos/bugs/issues/1808
  • https://github.com/coreos/bugs/issues/1313

我有下面的错误和重启docker守护进程似乎修复它。我还不知道是什么原因导致的

level=error msg=" POST/v1.41/containers/create的Handler返回错误:layer不存在">

重新启动docker守护进程:

sudo systemctl restart docker

我迟到了,但也许我的答案可以帮助某人在未来。下面是我遇到的问题:

  • 突然几个(3)我的容器,包括portainer停止工作。在使用docker容器再次运行容器时,导致层未找到错误。
  • 使用docker的容器列表
  • 使用docker Image ls列出的映像没有列出与三个停止的容器相关的三个映像。
  • 尝试拉新图像不工作
latest: Pulling from portainer/portainer-ce
Digest: sha256:9fa1ec78b4e29d83593cf9720674b72829c9cdc0db7083a962bc30e64e27f64e
Status: Image is up to date for portainer/portainer-ce:latest
  • 试图使用docker image rm删除图像导致以下错误:
Error response from daemon: unrecognized image ID sha256:a87d51c7a32408ba63e65888d023ad7d4328fd575d8a4c8bd8cffa495fcd055c

解决方案

  1. 在上面列出的图像删除过程中记录sha256 id,在我的示例中,对于portainer,图像的sha256 id为a87d51c7a32408ba63e65888d023ad7d4328fd575d8a4c8bd8cffa495fcd055c

  2. 导航到/var/lib/docker/image/overlay2/imagedb/content/sha256并删除/移动与sha256 ID相同名称的文件

  3. 尝试使用docker image pull命令再次拉取映像。现在应该可以了。

  4. 运行容器/撰写文件

  5. 对所有违规图片重复此过程。

这是一个有点繁琐的过程,特别是对于很多图像,但它比nuking/var/lib/docker目录要好。

如果肯·安德森的方法适合你,可以选择:对我来说,它发生在redis:alpine。和docker run -it redis:alpine以"layer not found"。

$ docker run -it redis:alpine
docker: Error response from daemon: layer does not exist.

我没有容器,没有图像显示:

docker container ls -a|grep redis返回nothing

docker images | grep redis返回nothing

只是手动重新拉图像(docker pull redis:alpine)对我有效。

$ docker pull redis:alpine
alpine: Pulling from library/redis
c41833b44d91: Pull complete
e3a3ca428482: Pull complete
a43e117b1823: Pull complete
fc0c5fc7bd09: Pull complete
c76199591618: Pull complete
999bf2ab518f: Pull complete
Digest: sha256:221f7fa5b4c563971358755893263d64b0b52e9798f6320f2898be499fb3b6b6
Status: Downloaded newer image for redis:alpine
docker.io/library/redis:alpine
$ docker run -it redis:alpine
1:C 01 Apr 2023 09:17:21.850 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 01 Apr 2023 09:17:21.850 # Redis version=7.0.10, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 01 Apr 2023 09:17:21.850 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 01 Apr 2023 09:17:21.852 * monotonic clock: POSIX clock_gettime
...

最新更新