提问人:mavex857 提问时间:11/6/2023 更新时间:11/6/2023 访问量:50
Dockerfile 中的 Chmod:没有这样的文件或目录
Chmod in Dockerfile: No such file or directory
问:
我尝试构建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
为什么会这样,我该如何解决?
答:
您应该完全删除该行。还要考虑删除它前面的行。RUN
VOLUME
从安全角度来看,将目录(或任何内容)更改为模式 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 指令。导致您在此处看到的特定错误并非不可能。最明显的效果是防止对映像中的命名目录进行任何进一步的更改,因此同样不会产生影响;它的第二个最明显的影响是泄露匿名卷。除非你清楚你想要它做什么以及为什么需要它,否则删除那一行几乎总是安全的。VOLUME
VOLUME
VOLUME
RUN chmod
VOLUME
评论
RUN chmod 777 /srv/jupyterhub/shared_data
mkdir ... && chmod...