在主机和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
拥有,并且以后不能被浏览器或我的桌面用户访问。
所以我的问题是:
- 我应该如何pipe理主机和容器环境下的权限(当我想在两个环境中的容器上运行命令时)?
- 是否可以configurationDocker,使作为卷挂载的目录自动获得特定的所有权/许可权(例如“root:www-data”)?
- 我可以自由地创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
)。