Dockerfile 中的 Chmod:没有这样的文件或目录

Chmod in Dockerfile: No such file or directory

提问人:mavex857 提问时间:11/6/2023 更新时间:11/6/2023 访问量:50

问:

我尝试构建Jupyterhub Docker映像,但无法在卷上使用。 我的 Dockerfile 如下所示:chmod

FROM jupyterhub/jupyterhub:latest

RUN pip install --no-cache \
    oauthenticator \
    dockerspawner \
    jupyterhub-nativeauthenticator


COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py

WORKDIR /srv/jupyterhub
VOLUME /srv/jupyterhub/shared_data

RUN chmod 777 /srv/jupyterhub/shared_data

构建此版本会导致以下错误:> [6/6] RUN chmod 777 /srv/jupyterhub/shared_data: 0.118 chmod: cannot access '/srv/jupyterhub/shared_data': No such file or directory

为什么会这样,我该如何解决?

docker dockerfile chmod

评论

1赞 Turing85 11/6/2023
卷在映像生成时不存在,但在容器运行时不存在。
0赞 Turing85 11/6/2023
如何在构建期间将主机卷挂载到 Dockerfile 中的 docker 容器中,其答案显示了如何在映像构建时从上下文挂载目录,但这些挂载是只读的。
0赞 mavex857 11/6/2023
感谢您的见解。我基本上只想在容器中创建一个持久文件夹,我可以读取和写入该文件夹,并且可以与其他容器共享。基本上是容器之间的共享文件夹。最简单的方法是什么?
0赞 Turing85 11/6/2023
卷是最简单的方法。只需删除 .RUN chmod 777 /srv/jupyterhub/shared_data
0赞 STerliakov 11/6/2023
@Turing85嗯?实际上,这是解决挂载到非根容器的卷的权限问题的常用方法 - 文件夹内容(如果有)将被卷替换,但权限将被保留。如果您有一个非 root 用户,那么(据我所知)这是能够写入挂载卷的目录的唯一方法。有问题的 Dockerfile 缺少 mkdir,而不是不必要的指令。mkdir ... && chmod...

答:

1赞 David Maze 11/6/2023 #1

您应该完全删除该行。还要考虑删除它前面的行。RUNVOLUME

从安全角度来看,将目录(或任何内容)更改为模式 0777 几乎从不被视为最佳实践。它允许任何用户覆盖任何其他用户的内容;“覆盖”可能包括对内容的细微更改或将恶意软件注入二进制文件。

对于 Docker 容器,容器内只有一个进程,因此没有理由使用主动不安全的设置。保留默认文件模式 0755(只能由所有者写入),并确保容器用户正确。由于此目录最终将是一个卷挂载,因此您可以确定哪个(数字)用户 ID 拥有主机目录

ls -lnd ./shared_data

,然后以该特定数字用户 ID 的形式启动容器。

docker run -u 1001 -v "$PWD/shared_data:/srv/jupyterhub/shared_data" ...

通过此卷装载,容器目录将完全替换为主机目录,包括其所有权和权限。这意味着,忽略该错误,该命令仍然不会生效,因为其他目录将替换它。无法从 Dockerfile 更改最终装载的目录。RUN chmod

卷装载也不需要 Dockerfile 指令。导致您在此处看到的特定错误并非不可能。最明显的效果是防止对映像中的命名目录进行任何进一步的更改,因此同样不会产生影响;它的第二个最明显的影响是泄露匿名卷。除非你清楚你想要它做什么以及为什么需要它,否则删除那一行几乎总是安全的。VOLUMEVOLUMEVOLUMERUN chmodVOLUME