【问题标题】:Craft CMS With Php/Nginx on Docker can't write outside Document Root在 Docker 上使用 Php/Nginx 制作 CMS 无法在文档根目录外写入
【发布时间】:2016-01-03 06:09:10
【问题描述】:

我正在尝试使用带有 Php 和 Nginx 的 Docker 设置基本 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 构建文件 - Docker 文件:

FROM nginx:latest

COPY ./default.conf /etc/nginx/conf.d/default.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

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

【问题讨论】:

  • 会不会和 SELinux 权限有关?
  • 我根本不相信我安装了 SELinux。

标签: php nginx docker content-management-system docker-compose


【解决方案1】:

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

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

【讨论】:

  • volumes 命令不会覆盖那里已经存在的任何内容。我登录到容器中的 bash 进行仔细检查,它确实存在。我能够解决我的问题,但我不确定这是否是最安全/最有效的方法。请参阅我的编辑 1。
  • 啊,明白了。这是我所拥有的最好的理论。
猜你喜欢
  • 2011-03-19
  • 2021-05-12
  • 2012-02-21
  • 2014-12-18
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多