在主机和Docker容器环境中pipe理目录权限

我正在尝试使用Docker容器构build的堆栈来运行Symfony2应用程序( SfDocker )。 堆栈由相互连接的容器组成,其中ubuntu:14.04是一个基础:

  • MySQL数据库
  • nginx的
  • PHP-FPM

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

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

装入的目录将始终由root或身份不明的用户(在运行ls -al时仅显示用户标识)拥有。

这实质上使得不可能通过浏览器访问应用程序。 当然,运行chown -R root:www-data在公共目录解决了这个问题,但是一旦我想要写入到例如'cache'目录作为从主机(用户是ltarasiewicz ),我会得到permission denied error 。 最重要的是,无论何时在一个容器内运行的应用程序创build新的目录(eh'logs'),它们又被root拥有,并且以后不能被浏览器或我的桌面用户访问。

所以我的问题是:

  1. 我应该如何pipe理主机和容器环境下的权限(当我想在两个环境中的容器上运行命令时)?
  2. 是否可以configurationDocker,使作为卷挂载的目录自动获得特定的所有权/许可权(例如“root:www-data”)?
  3. 我可以自由地创build新的用户和用户组在我的'nginx'容器内build立的Ubuntu:14.04图像?

一些一般的观点,如果我不直接回答你的问题,表示歉意。

  • 不要在容器中以root身份运行。 在Dockerfile中创build一个用户,并使用USER语句或入口点或命令脚本切换到该用户。 看到这个Redis官方图像是一个很好的例子。 (所以Q3的答案是肯定的,但通过Dockerfile – 不要手动更改容器)。

  • 请注意,官方图像通常会在入口脚本中进行大量的处理,以避免您在第2节中描述的这个问题。

  • 考虑使用数据容器,而不是直接链接到主机目录。 有关更多信息,请参阅官方文档 。

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