Apache 如何管理装入docker容器的卷的权限?
我正在开发一个Wordpress主题,希望在我的开发设置中使用Docker。我所做的很简单:Apache 如何管理装入docker容器的卷的权限?,apache,docker,permissions,docker-compose,docker-volume,Apache,Docker,Permissions,Docker Compose,Docker Volume,我正在开发一个Wordpress主题,希望在我的开发设置中使用Docker。我所做的很简单: 创建一个运行MySQL 5.7的数据库服务 创建一个wordpress服务,我将主题文件夹作为卷装入/var/www/html/wp content/themes 但是,我正在努力解决卷权限问题 我正在使用以下项目文件夹结构: . ├── docker-compose.yml └── my-theme 我的docker compose.yml文件如下所示: version: '3.2' serv
- 创建一个运行MySQL 5.7的
服务数据库
- 创建一个
服务,我将主题文件夹作为卷装入wordpress
/var/www/html/wp content/themes
.
├── docker-compose.yml
└── my-theme
我的docker compose.yml
文件如下所示:
version: '3.2'
services:
database:
image: mysql:5.7
volumes:
- my_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: root
wordpress:
depends_on:
- database
image: wordpress:php7.3-apache
ports:
- '8000:80'
restart: always
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: root
working_dir: /var/www/html
volumes:
- type: volume
source: ./my-theme
target: /var/www/html/wp-content/themes/my-theme
volumes:
my_data: {}
当我运行docker compose up
时,一切都按预期进行:创建了容器,我可以在浏览器中访问Wordpress。但是,我作为卷装载的主题在激活时不会呈现任何内容
当我sh
进入wordpress
容器(docker compose exec wordpress sh
)时,我可以看到wp content/themes
文件夹属于root
。所以我想这就是问题所在
我通过手动和递归地chown
ing容器中的wp content
文件夹验证了这是一个权限问题:
chown-R www-data:www-data/var/www/html/wp-content
完成后,我的主题就如预期的那样呈现出来了。因此,现在我正在寻找一种方法来避免这个chown
过程(想法是任何其他开发人员都可以克隆这个项目,只需运行docker compose-up
并开始工作)
我尝试的第一件事是制作一个Dockerfile,在那里我将构建一个稍微定制的Wordpress图像:
FROM wordpress:php7.3-apache
RUN mkdir -p /var/www/html/wp-content/themes/test-theme \
&& chown -R /var/www/html/wp-content
我的推理是,通过创建目录并预先对其进行chown
ing,卷将继承user:group映射。唉,没有这样的事;装载卷将覆盖此映射并将其设置回root:root
之后,我尝试在我的docker compose.yml
文件中设置APACHE\u RUN\u用户
和APACHE\u RUN\u组
环境变量:
version: '3.2'
services:
database:
...
wordpress:
...
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: root
APACHE_RUN_USER: '$(id -u)'
APACHE_RUN_GROUP: '$(id -g)'
working_dir: /var/www/html
volumes:
- type: volume
source: ./my-theme
target: /var/www/html/wp-content/themes/my-theme
volumes:
my_data: {}
然而,这在构建时抛出了一系列apache错误
我现在有点不知所措。在Docker中是否有管理已装入卷的权限的最佳做法?为此,我在谷歌上搜索了很多,但我确实找到了一些解决方案。你可以通过覆盖wordpress图像的入口点来实现这一点 在项目中创建文件startup.sh,并使其可执行:
#!/bin/bash
chown -R www-data:www-data /var/www/html/wp-content
docker-entrypoint.sh apache2-foreground
然后在docker-compose.yml中:
...
wordpress:
...
working_dir: /var/www/html
volumes:
- './my-theme:/var/www/html/wp-content/themes/my-theme'
- './startup.sh:/startup.sh'
entrypoint: /startup.sh
这对我很有效,如果您在实现它时遇到问题,请告诉我。您到底面临哪些Apache错误?我怀疑
'$(id-u)
是错误的,因为Shell变量不会在单引号之间求值,尽管我不确定这是否适用于这里。除此之外,在Dockerfile中执行chown
是完全合法的(这是讨论此问题的GitHub问题)。事实上,我还认为在Dockerfile中执行chown
可以实现此目的(基于您链接的同一GH问题),但似乎一旦我装载卷,权限就会被覆盖并设置回root:root。我通过做docker-compose-up
和volumes
输入wordpress服务进行测试。当我在没有装入卷的情况下进入容器时,ls-l
显示wp-content文件夹的www-data:www-data
。一旦我装入卷,ls-l
显示root:root
…请稍等,我说得太快了。wordpress容器的构建比平常延迟得多,但最终还是成功了。现在开始工作了!谢谢你的帮助。