Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何管理装入docker容器的卷的权限?_Apache_Docker_Permissions_Docker Compose_Docker Volume - Fatal编程技术网

Apache 如何管理装入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

我正在开发一个Wordpress主题,希望在我的开发设置中使用Docker。我所做的很简单:

  • 创建一个运行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容器的构建比平常延迟得多,但最终还是成功了。现在开始工作了!谢谢你的帮助。