我正在开发Wordpress主题,并想在我的开发设置中使用Docker。我所做的非常简单:
database
服务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
容器中的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
对其进行命名,该卷将继承user:group映射。 ,,没有这样的事情。安装卷将覆盖此映射,并将其设置回root:root
。
之后,我尝试在APACHE_RUN_USER
文件中设置APACHE_RUN_GROUP
和docker-compose.yml
环境变量:
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中管理挂载卷的权限是否有最佳实践?我为此进行了很多搜索,但是我发现的解决方案有点困扰我。
答案 0 :(得分:1)
您可以通过覆盖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
这对我有用,请让我知道您在实施它时遇到问题。