【问题标题】:Docker: how to set up file ownership in a data-only container?Docker:如何在纯数据容器中设置文件所有权?
【发布时间】:2015-06-11 07:03:32
【问题描述】:

我已经使用纯数据容器对 PHP 应用程序进行了 docker 化。我使用了这个 (docker-symfony) 容器堆栈。

这是对纯数据容器的简单定义:

FROM debian:jessie
MAINTAINER Vincent Composieux <vincent.composieux@gmail.com>
VOLUME /var/www/symfony

除了所有权和权限之外,一切都非常好。我注意到,当我将卷(我的本地目录)挂载到纯数据容器时,挂载的文件仍然由主机上的当前用户拥有,在容器内无法识别。

例如,如果我以docker-compose up 作为ltarasiewicz 启动容器,然后登录到数据容器,我可以看到已挂载的文件的所有权设置为:

drwxrwxr-x 7 1000 1000 4096 Jun 10 21:27 symfony

1000 中的uidgid 对应于我主机的用户uidgid。因为容器内没有这样的用户,所以只显示 symfony 目录的 ID。这使得应用程序无法运行。

所以我的问题是如何将卷安装到仅数据容器并为已安装的文件分配正确的所有权,例如root:www-data 或我选择的任何其他用户。

【问题讨论】:

    标签: docker dockerfile docker-compose


    【解决方案1】:

    使用与运行应用程序相同的图像来创建数据容器。例如,如果您想创建一个 postgresql 数据库,请使用 postgres 映像作为您的数据容器:

    $ docker run --name dc postgres echo "Data Container"
    

    此命令创建数据容器并退出 - 请注意数据容器并未继续运行。

    在 postgres 的情况下,在您使用卷启动数据库之前,不会正确设置卷所有权:

    $ docker run -d --volumes-from dc postgres
    

    但其他镜像会在 Dockerfile 中正确设置所有权。

    当然,如果你只是想修复数据容器中的权限,只需挂载它并运行 chown:

    $ docker run --volumes-from dc postgres chown -R postgres:postgres /var/lib/postgresql/data
    

    【讨论】:

    • 嗨阿德里安。谢谢你的建议。为纯数据容器重用现有的symfony/nginx 图像很有帮助。我注意到所有权问题已通过将RUN usermod -u 1000 www-data 添加到 nginx 映像 Dockerfile 来解决。我认为这样 1000 的 uid(主机用户 ID)将对应于容器内的 www-data。这样,所有作为卷安装在由symfony/nginx 制成的容器内的文件都将归www-data 所有。但是,我不喜欢启动容器然后运行chown 的想法。我认为冗余太多了。
    • 这种方法的问题是您已经将图像绑定到您的系统 - 不是 uid 1000 的用户将无法使用它。再次看一下 redis 和 mongo 官方镜像的作用——它们在运行时在 entrypoint.sh 中运行 chown。
    • 嗯,我认为 www-data 通常由系统分配 UID 33。改变这一点可能是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2021-05-16
    • 2021-04-07
    • 2021-03-29
    相关资源
    最近更新 更多