idi*_*dix 4 apache permissions docker docker-compose docker-volume
我正在开发一个 Wordpress 主题,并希望在我的开发设置中使用 Docker。我所做的很简单:
database运行 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. 所以我想这就是问题所在。
我通过手动和递归地chowningwp-content容器中的文件夹来验证这是一个权限问题:
.
??? docker-compose.yml
??? my-theme
完成后,我的主题会按预期呈现。所以现在我正在寻找一种方法来避免这个chown过程(这个想法是任何其他开发人员都可以克隆这个项目,只需运行docker-compose up and start working).
我尝试的第一件事是制作一个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.
在那之后,我试图设置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 中已安装卷权限的最佳实践?我为此在谷歌上搜索了很多,但我找到的解决方案有点超出我的想象。
您可以通过覆盖 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
这对我有用,如果您在实施时遇到问题,请告诉我。
| 归档时间: | 
 | 
| 查看次数: | 3688 次 | 
| 最近记录: |