在Docker上用Php/Nginx制作CMS可以';不要在文档根目录之外写入


Craft CMS With Php/Nginx on Docker can't write outside Document Root

我正在尝试使用Docker与Php和Nginx建立一个容器化版本的基本Craft CMS。Craft似乎无法写入我的Nginx文档根目录之外的文件夹。(更多细节请参阅文章底部)我正在使用Docker Compose,这是我目前的Docker Compose.yml:

nginx:
   build: ./compose/nginx/
   ports:
     - 80:80
   links:
     - php
   volumes_from:
     - app
php:
   build: ./compose/php/
   expose:
     - 9000
   links:
     - mysql
   volumes_from:
     - app
app:
   image: php:7.0-fpm
   volumes:
     -   ./app:/var/www/html
     -   ./vendors:/var/www
   command: "true"
mysql:
   image: mysql:latest
   volumes_from:
     - data
environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: project
    MYSQL_USER: project
    MYSQL_PASSWORD: project
data:
   image: mysql:latest
   volumes:
     - /var/lib/mysql
   command: "true"
phpmyadmin:
   image: phpmyadmin/phpmyadmin
   ports:
     - 8080:8080
   links:
     - mysql
   environment:
     PMA_HOST: mysql

这个设置非常有效,以下是我为Nginx创建的两个构建文件-DockerFile:

FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf

默认.conf

server {
    listen 80 default_server;
    root /var/www/html;
    index index.html index.php;
    charset utf-8;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    access_log off;
    error_log  /var/log/nginx/error.log error;
    sendfile off;
    client_max_body_size 100m;
    location ~ '.php$ {
        fastcgi_split_path_info ^(.+'.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
    }
    location ~ /'.ht {
        deny all;
    }
}

一切都近乎完美,在我尝试部署Craft CMS之前,我知道我没有所有的php扩展,但我不认为这会影响我的问题。我一直收到错误,/var/www/craft/config是PHP不可写的。请解决这个问题。因此,我假设这是一个Nginx和PHP权限错误。尽管如此,我已经尝试在我的nginx和php容器以及chmod 777 craft/config文件夹中打开一个bash shell,但我仍然会收到这个错误,因此我有点困惑于如何修复它。

编辑1------我能够通过在php构建概要文件中的Dockerfile中实现以下内容来解决这个问题。

RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
RUN chown -R www-data:www-data /var/www

我不确定这是否是最安全的方式。

docker compose.yml应用程序容器定义中的卷声明/vendors:/var/www有效地覆盖了/app:/var/www/html/strong>/var/www/craft/因此很可能不存在。应用的数量声明应如下所示:

app:
   image: php:7.0-fpm
   volumes:
     -   ./app:/var/www/html
     -   ./vendors:/var/www/vendors
   command: "true"