跨主机和 Docker 容器环境管理目录权限

Managing directory permissions across the host and Docker container environments

我正在尝试将使用 Docker 容器构建的堆栈用于 运行 Symfony2 应用程序 (SfDocker)。堆栈由相互关联的容器组成,其中 ubuntu:14.04 是基础:

我面临的反复出现的问题是管理容器内的目录权限。当我从主机挂载一个 vloume 时,例如

volumes:   
- symfony-code:/var/www/app

安装的目录将始终由容器内的 root 或身份不明的用户(只有用户 ID 在 运行 宁 ls -al 时可见)拥有。

从本质上讲,这使得无法通过浏览器访问应用程序。当然 运行ning chown -R root:www-data on public 目录解决了这个问题,但是一旦我想写信给例如'cache' 来自主机的目录(用户所在的位置 ltarasiewicz)我会得到 permission denied error。最重要的是,每当容器内的应用程序 运行ning 创建新目录(e.h。'logs')时,它们再次归 root 所有,以后浏览器将无法访问或我的桌面用户。

所以我的问题是:

  1. 我应该如何跨主机和容器管理权限 环境(当我想 运行 来自两个容器的命令时 环境)?
  2. 是否可以配置 Docker 以便安装为卷的目录自动接收特定的 ownership/permissions(例如 'root:www-data')?
  3. 我可以在 'nginx' 由 Ubuntu:14.04 图像构建的容器中自由创建新用户和用户组吗?

一些一般性的问题,如果我没有直接回答你的问题,请见谅。

  • 不要 运行 在容器中作为 root。使用 USER 语句或在入口点或命令脚本中,在 Dockerfile 中创建一个用户并切换到该用户。有关此方面的一个很好的例子,请参见 Redis official image。 (所以问题 3 的答案是肯定的,并且会这样做,但是通过 Dockerfile - 不要手动更改容器)。

  • 请注意,官方图像通常会chown on volumes in the entrypoint script以避免您在 2 中描述的问题。

  • 考虑使用数据容器而不是直接链接到主机目录。有关详细信息,请参阅 official docs

  • 不要 运行 来自主机的卷上的命令。只需创建一个临时容器来执行此操作或使用 docker exec(例如 docker run -v /myvol:/myvol myimage touch /myvol/x)。