如何管理安装到 docker 容器中的卷的权限?
How to manage permissions for a volume mounted into a docker container?
我正在开发一个 Wordpress 主题,想在我的开发设置中使用 Docker。我所做的非常简单:
- 创建一个
database
服务运行宁MySQL5.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
并开始工作)。
我尝试的第一件事是制作一个 Docker 文件,我将在其中构建一个稍微自定义的 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 映射。 las,没有这样的事情;安装卷会覆盖此映射并将其设置回 root:root
.
之后,我尝试在 docker-compose.yml
文件中设置 APACHE_RUN_USER
和 APACHE_RUN_GROUP
环境变量:
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 并使 make 可执行:
#!/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
这对我有用,如果您在实施时遇到问题,请告诉我。
我正在开发一个 Wordpress 主题,想在我的开发设置中使用 Docker。我所做的非常简单:
- 创建一个
database
服务运行宁MySQL5.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
并开始工作)。
我尝试的第一件事是制作一个 Docker 文件,我将在其中构建一个稍微自定义的 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 映射。 las,没有这样的事情;安装卷会覆盖此映射并将其设置回 root:root
.
之后,我尝试在 docker-compose.yml
文件中设置 APACHE_RUN_USER
和 APACHE_RUN_GROUP
环境变量:
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 并使 make 可执行:
#!/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
这对我有用,如果您在实施时遇到问题,请告诉我。