如何管理安装在Docker容器中的卷的权限?

时间:2019-04-24 08:22:11

标签: apache docker permissions docker-compose docker-volume

我正在开发Wordpress主题,并想在我的开发设置中使用Docker。我所做的非常简单:

  • 创建一个运行MySQL 5.7的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_GROUPdocker-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中管理挂载卷的权限是否有最佳实践?我为此进行了很多搜索,但是我发现的解决方案有点困扰我。

1 个答案:

答案 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

这对我有用,请让我知道您在实施它时遇到问题。

相关问题