在Dockerfile设置中运行chown命令对根卷文件夹有影响吗?

48次阅读
没有评论

问题描述

在Docker容器中有一个命名为/foo的卷,在Dockerfile中进行如下操作:

RUN useradd -d /home/newuser -m -s /bin/bash newuser && \
    usermod newuser -g www-data
RUN chown -R newuser:www-data /foo

当容器设置完成后,用户可以看到这两个命令都没有报错,但/foo文件夹没有发生任何改变。在容器中运行shell时,可以看到用户已经创建。用户可以对其他目录和文件运行chown命令没有问题。需要注意的是,在Dockerfile中没有使用VOLUME命令。

解决方案

请注意以下操作可能涉及到版本差异,使用前做好备份。

最佳解决方案

在这种情况下,出现问题的原因是尝试在构建镜像时修改卷的权限。然而,Docker的工作流程是先根据Dockerfile构建镜像,然后将该镜像作为容器运行,并在运行时应用卷的配置。所以,在镜像构建过程中,是无法直接修改卷的权限的。

为了解决这个问题,你可以考虑以下几种选项:
1. 将逻辑移到入口脚本中:在容器启动时,以root用户启动容器,然后在入口脚本中将权限修改为新用户。可以使用工具如gosu来在执行应用程序之前切换到新用户。
2. 让Docker设置权限:当Docker创建一个命名卷时,会将其初始化为镜像中的文件,包括它们的所有权和权限。这只在命名卷为空时才会发生,一旦创建并在使用中,镜像的更改将不会在卷中反映出来。
3. 在挂载到容器之前在主机上配置卷权限:这适用于主机卷(也称为绑定挂载),在将其挂载到容器之前,可以在主机上配置卷的权限。

综上所述,最佳实践是避免在构建镜像过程中尝试修改卷的权限,而是在容器运行时的适当时机进行权限更改操作。根据你的需求,可以选择上述提到的任一方法来实现。

正文完