Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Docker overlay2:遍历文件系统时出错:OSError[Errno 40]符号链接级别过多_Linux_Docker - Fatal编程技术网

Linux Docker overlay2:遍历文件系统时出错:OSError[Errno 40]符号链接级别过多

Linux Docker overlay2:遍历文件系统时出错:OSError[Errno 40]符号链接级别过多,linux,docker,Linux,Docker,主应用程序:starlette(python)Web应用程序上的uvicorn服务器 当我试图调试标题中的错误时(下面是疑难解答日志),在主机的FS(/var/lib/docker/overlay2/[IMAGE\u HASH\u文件夹)上运行以下命令 find -L ./ -mindepth 15 我找到了循环中涉及的文件。 本地是/usr/bin/X11,在服务器上我得到以下信息: error-walking-file-system:OSError[Errno 40]符号链接级别太多:'/

主应用程序:starlette(python)Web应用程序上的uvicorn服务器

当我试图调试标题中的错误时(下面是疑难解答日志),在主机的FS(/var/lib/docker/overlay2/[IMAGE\u HASH\u文件夹)上运行以下命令

find -L ./ -mindepth 15
我找到了循环中涉及的文件。 本地是
/usr/bin/X11
,在服务器上我得到以下信息:

error-walking-file-system:OSError[Errno 40]符号链接级别太多:'/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/fd/6/dev/stderr'

冲突文件的所有者(FS是主机的所有者),在修剪后等待docker服务重新启动:

➜  overlay2 find -L ./ -mindepth 15          

find: File system loop detected; ‘./d2dba43e7cdbdec81bac529bb85908a7f859f227cda0149389f164272cb372e8/diff/usr/bin/X11’ is part of the same file system loop as ‘./d2dba43e7cdbdec81bac529bb85908a7f859f227cda0149389f164272cb372e8/diff/usr/bin’.

   find: File system loop detected; ‘./6ec18b03535c1dac329e05b2abdc68fb0eea742a06878d90f84c4de73ea6a4a9/merged/usr/bin/X11’ is part of the same file system loop as ‘./6ec18b03535c1dac329e05b2abdc68fb0eea742a06878d90f84c4de73ea6a4a9/merged/usr/bin’.

     find: File system loop detected; ‘./l/GCDLBXTJXAL5PFTI4BE3MM3OE2/usr/bin/X11’ is part of the same file system loop as ‘./l/GCDLBXTJXAL5PFTI4BE3MM3OE2/usr/bin’.
    
    ➜  overlay2 ls -l ./d2dba43e7cdbdec81bac529bb85908a7f859f227cda0149389f164272cb372e8/diff/usr/bin/X11
    lrwxrwxrwx 1 root root 1 May  3  2017 ./d2dba43e7cdbdec81bac529bb85908a7f859f227cda0149389f164272cb372e8/diff/usr/bin/X11 -> .
dockerfile:

FROM python:3.8

COPY src/ ./

RUN /usr/local/bin/python -m pip install --upgrade pip || true
RUN pip install -r requirements.txt || true

ARG POSTGRES_USER
ENV POSTGRES_USER=$POSTGRES_USER
ARG POSTGRES_PASSWORD
ENV POSTGRES_PASSWORD=$POSTGRES_PASSWORD
ARG POSTGRES_SERVER
ENV POSTGRES_SERVER=$POSTGRES_SERVER
ARG POSTGRES_DB
ENV POSTGRES_DB=$POSTGRES_DB
ARG POSTGRES_PORT
ENV POSTGRES_PORT=$POSTGRES_PORT
ARG SESSION_SECRET
ENV SESSION_SECRET=$SESSION_SECRET
ARG DO_YOU_WANT_USERS
ENV DO_YOU_WANT_USERS=$DO_YOU_WANT_USERS
ARG WHERE_AM_I
ENV WHERE_AM_I=$WHERE_AM_I
# SSL
ARG FORWARDED_ALLOW_IPS
ENV FORWARDED_ALLOW_IPS=$FORWARDED_ALLOW_IPS
ARG SSL_CERTIFICATE
ENV SSL_CERTIFICATE=$SSL_CERTIFICATE
ARG SSL_KEYFILE
ENV SSL_KEYFILE=$SSL_KEYFILE
ARG UPLOADS_PATH
ENV UPLOADS_PATH=$UPLOADS_PATH

RUN echo "FINAL STAGE - RUN APP"

EXPOSE 7000
CMD ["python", "run.py"]
我可以使用通常绑定的卷运行容器:

UPLOADS_PATH=/var/opt/tmp
LOCAL_UPLOADS_PATH=/var/containers/TEST_UPLOADS

docker build --build-arg POSTGRES_USER --build-arg POSTGRES_PASSWORD --build-arg POSTGRES_SERVER --build-arg POSTGRES_DB --build-arg POSTGRES_PORT --build-arg UPLOADS_PATH --build-arg WHERE_AM_I --build-arg SESSION_SECRET --build-arg DO_YOU_WANT_USERS -t test .

docker run -d --name test_container -v ${LOCAL_UPLOADS_PATH}:${UPLOADS_PATH} -p 7000:7000 test
或者在没有绑定的情况下,我仍然会收到相同的错误日志&每次请求后,应用程序都会不断重新启动

怎么可能在图像中有这样一个循环(链接文件?)

更新

在我用pybcrypt修改了bcrypt库,用cythonized版本修改了uvicorn库之前,容器一直运行得很顺利

非常感谢任何关于进一步探索的建议

另外,我也尝试过docker系统prune-a,虽然有一些不推荐的东西,但没有任何改变

第2页:@jordanvrtanoski我已经按照你的建议把问题分开了

更新#2

以下@jordanvrtanoski检查命令:

➜ docker image inspect -f $'{{.RepoTags}}\t{{.GraphDriver.Data.LowerDir}}' $(docker images -q)

[test:latest]   /var/lib/docker/overlay2/99e3b5db623ae543d045cc86c2d7d36400c8d1780ec4b86c297f5055bbdfe81a/diff:/var/lib/docker/overlay2/4ed6de1627ba5957c8fa9834c797a60d277c76e61f138d1b6909c55ef5475523/diff:/var/lib/docker/overlay2/7f790257bc4e6ed9e6ea6ef5bed0eb0cf3af213ea913484a40946a45639d8188/diff:/var/lib/docker/overlay2/c8e04185bdc7714e116615a3599a9832ebe2080b43f09b68331cca5d7c109371/diff:/var/lib/docker/overlay2/9ef94affd46bbcc11d62999ab0c59d6bf28cc6d51f13a7513b93bb209738940a/diff:/var/lib/docker/overlay2/62438cdccba1f312f34e8458e4ec695019e6af65107b2e16c3d7eaa53ca03c06/diff:/var/lib/docker/overlay2/9ec57b8b2680944690cdceae73c1c49b31716bd5efbed78bd3d54810bffdc7b6/diff:/var/lib/docker/overlay2/b2c4ce8d2b6764476a452489f58e615fcce939eaecb3d65466f81f5f115a5b5d/diff:/var/lib/docker/overlay2/f8609908601489fb7e3e28a32c423ee556ec041c69ba274a02de316ccbef5c48/diff:/var/lib/docker/overlay2/dcd13187b642277de35f299c1abb1d7d9695972e8b8893267a62f65338679080/diff:/var/lib/docker/overlay2/e2ed1696e3a34e69ed493da3a2c10b942f09384b1cebac54afebea6fef9c4521/diff
[python:3.8]    /var/lib/docker/overlay2/c8e04185bdc7714e116615a3599a9832ebe2080b43f09b68331cca5d7c109371/diff:/var/lib/docker/overlay2/9ef94affd46bbcc11d62999ab0c59d6bf28cc6d51f13a7513b93bb209738940a/diff:/var/lib/docker/overlay2/62438cdccba1f312f34e8458e4ec695019e6af65107b2e16c3d7eaa53ca03c06/diff:/var/lib/docker/overlay2/9ec57b8b2680944690cdceae73c1c49b31716bd5efbed78bd3d54810bffdc7b6/diff:/var/lib/docker/overlay2/b2c4ce8d2b6764476a452489f58e615fcce939eaecb3d65466f81f5f115a5b5d/diff:/var/lib/docker/overlay2/f8609908601489fb7e3e28a32c423ee556ec041c69ba274a02de316ccbef5c48/diff:/var/lib/docker/overlay2/dcd13187b642277de35f299c1abb1d7d9695972e8b8893267a62f65338679080/diff:/var/lib/docker/overlay2/e2ed1696e3a34e69ed493da3a2c10b942f09384b1cebac54afebea6fef9c4521/diff
更新#3

因此,在遵循@jordanvrtanoski的建议和这篇帖子(@Janith Shanilka)之后:

我丢失了以下文件:

nano /etc/docker/daemon.json
并填充有:

{
  "storage-driver": "aufs"
}
然后
sudo systemctl重新启动docker

现在应用程序没有崩溃,但我仍然收到相同的循环消息:

error walking file system: OSError [Errno 40] Too many levels of symbolic links: '/usr/bin/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/X11/cc'
还有@jordanvrtanoski

➜  docker image inspect -f $'{{.RepoTags}}\t{{.GraphDriver.Data.LowerDir}}' $(docker images -q)


[test:latest]   <no value>
[python:3.8]    <no value>
更新#4

所以在@jordanvrtanoski的建议下,我把docker从“aufs”返回到overlay。 以下结果来自主机:

➜ cd/var/lib/docker/overlay2 ➜ 查找-L./-mindepth 15 查找:检测到文件系统循环;'./2ECF467259235C8C4605B058BFF4F80100790EE7F5010D49546AAB1A7F28686/merged/usr/bin/X11'与'./2ECF467259235C8C4605B058BFF4F80100790EE7F5010D49546AAB1A7F28686/merged/usr/bin'属于同一文件系统循环。 查找:检测到文件系统循环;'/6F39E8E2089C99F636DA9A534E2CCBE7E41202 EB2CE645EFA9387DD0EF0B908/diff/usr/bin/X11'与'/6F39E8E2089C99F636DA9A534E2CCBE7E41202 EB2CE645EFA9387DD0EF0B908/diff/usr/bin'是同一文件系统循环的一部分。
查找:检测到文件系统循环;'./l/5AOADDMRCAKLG2FQDDJEYC6CY2/usr/bin/X11'是与'./l/5AOADDMRCAKLG2FQDDJEYC6CY2/usr/bin'相同的文件系统循环的一部分。

此问题是由
pyhton:3.8
图像中的自引用符号linl引起的

~# docker run -ti --rm python:3.8 bash

root@ef6c6f4e18ff:/# ls -l /usr/bin/X11/X11
lrwxrwxrwx 1 root root 1 May  3  2017 /usr/bin/X11/X11 -> .
修复循环引用是由
python:3.8
图像引起的。您只需删除
/usr/bin/X11/X11
符号链接即可

root@ef6c6f4e18ff:/# rm /usr/bin/X11/X11
您可以将其添加到生成文件中,如下所示:

FROM python:3.8

COPY src/ ./

RUN rm /usr/bin/X11/X11

RUN /usr/local/bin/python -m pip install --upgrade pip || true
RUN pip install -r requirements.txt || true

ARG POSTGRES_USER
ENV POSTGRES_USER=$POSTGRES_USER
ARG POSTGRES_PASSWORD
ENV POSTGRES_PASSWORD=$POSTGRES_PASSWORD
ARG POSTGRES_SERVER
ENV POSTGRES_SERVER=$POSTGRES_SERVER
ARG POSTGRES_DB
ENV POSTGRES_DB=$POSTGRES_DB
ARG POSTGRES_PORT
ENV POSTGRES_PORT=$POSTGRES_PORT
ARG SESSION_SECRET
ENV SESSION_SECRET=$SESSION_SECRET
ARG DO_YOU_WANT_USERS
ENV DO_YOU_WANT_USERS=$DO_YOU_WANT_USERS
ARG WHERE_AM_I
ENV WHERE_AM_I=$WHERE_AM_I
# SSL
ARG FORWARDED_ALLOW_IPS
ENV FORWARDED_ALLOW_IPS=$FORWARDED_ALLOW_IPS
ARG SSL_CERTIFICATE
ENV SSL_CERTIFICATE=$SSL_CERTIFICATE
ARG SSL_KEYFILE
ENV SSL_KEYFILE=$SSL_KEYFILE
ARG UPLOADS_PATH
ENV UPLOADS_PATH=$UPLOADS_PATH

RUN echo "FINAL STAGE - RUN APP"

EXPOSE 7000
CMD ["python", "run.py"]
更新#5

找到原因:lib
uvicorn[standard]
是其自身的cythonized版本。一旦我删除了它,所有错误都消失了。所以我将把它移到uvicorn的github


@jordanvrtanoski再次感谢您的帮助!

我已经调整了问题。请在构建部分之前添加Dockerfile作为参考。我刚刚添加了它。谢谢。我已经根据您的指导更新了问题,谢谢。aufs与overlay2是不同的驱动程序。通过更改驱动程序,您将不再使用overlay2。清理所有docker映像和容器,然后移回overlay2。好的,我删除了@/var/lib/docker:aufs,overlay2完全->系统修剪*重新启动docker服务。现在我又回到了原点:应用程序在登录后崩溃,有相同的错误日志。至少有“aufs”,虽然我有相同/类似的错误,但应用程序运行正常,但错误日志变得庞大。我还应该采取其他措施吗?已经这样做了,运行docker的bash脚本总是在docker运行之前杀死并删除所有容器和所有图像。此外,prune-a虽然找到了要删除的内容,但我仍然得到了same错误。因此,下一步是找到文件的所有者。我会将此信息返回给您。首先重新启动docker引擎。进行手动清理。检查文件系统并确保没有循环。很好,我将尽快对其进行测试并让您知道。我将发布冲突文件的所有者作为答案,因为注释限制了字符。
FROM python:3.8

COPY src/ ./

RUN rm /usr/bin/X11/X11

RUN /usr/local/bin/python -m pip install --upgrade pip || true
RUN pip install -r requirements.txt || true

ARG POSTGRES_USER
ENV POSTGRES_USER=$POSTGRES_USER
ARG POSTGRES_PASSWORD
ENV POSTGRES_PASSWORD=$POSTGRES_PASSWORD
ARG POSTGRES_SERVER
ENV POSTGRES_SERVER=$POSTGRES_SERVER
ARG POSTGRES_DB
ENV POSTGRES_DB=$POSTGRES_DB
ARG POSTGRES_PORT
ENV POSTGRES_PORT=$POSTGRES_PORT
ARG SESSION_SECRET
ENV SESSION_SECRET=$SESSION_SECRET
ARG DO_YOU_WANT_USERS
ENV DO_YOU_WANT_USERS=$DO_YOU_WANT_USERS
ARG WHERE_AM_I
ENV WHERE_AM_I=$WHERE_AM_I
# SSL
ARG FORWARDED_ALLOW_IPS
ENV FORWARDED_ALLOW_IPS=$FORWARDED_ALLOW_IPS
ARG SSL_CERTIFICATE
ENV SSL_CERTIFICATE=$SSL_CERTIFICATE
ARG SSL_KEYFILE
ENV SSL_KEYFILE=$SSL_KEYFILE
ARG UPLOADS_PATH
ENV UPLOADS_PATH=$UPLOADS_PATH

RUN echo "FINAL STAGE - RUN APP"

EXPOSE 7000
CMD ["python", "run.py"]