2017-01-14 1 views
4

Я пытаюсь запустить приложение Symfony 3 «base» (что означает не сложность вообще и только несколько установленных пакетов, но даже не включено) в стеке «LAMP» с помощью Docker и Docker Compose (я удалил MySQL от должности, потому что это не имеет значения). Это мой docker-compose.yml файл:«AH01071: получена ошибка« Не удалось открыть основной скрипт »: разрешения контейнера или проблема с Symfony3?

version: '2' 
services: 
    php-fpm: 
    build: docker/php-fpm 
    ports: 
     - "80:80" 
    volumes: 
     - ./sources:/data/www 
     - ./data/logs/symfony:/data/www/var/logs 
    db: 
    image: mysql 
    environment: 
     MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 
     MYSQL_DATABASE: ${MYSQL_DATABASE} 
     MYSQL_USER: ${MYSQL_USER} 
     MYSQL_PASSWORD: ${MYSQL_PASSWORD} 
    volumes: 
     - sql-data:/var/lib/mysql 

И это Dockerfile для php-fpm контейнера:

FROM reynierpm/docker-centos7-supervisord:latest 
ENV TERM=xterm \ 
    PATH="/root/.composer/vendor/bin:${PATH}" \ 
    COMPOSER_ALLOW_SUPERUSER=1 
RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \ 
        https://rpms.remirepo.net/enterprise/remi-release-7.rpm 
RUN yum install -y \ 
     yum-utils \ 
     git \ 
     zip \ 
     unzip \ 
     nano \ 
     httpd \ 
     php71-php-fpm \ 
     php71-php-cli \ 
     php71-php-common \ 
     php71-php-gd \ 
     php71-php-intl \ 
     php71-php-json \ 
     php71-php-mbstring \ 
     php71-php-mcrypt \ 
     php71-php-mysqlnd \ 
     php71-php-pdo \ 
     php71-php-pear \ 
     php71-php-xml \ 
     php71-pecl-apcu \ 
     php71-php-pecl-apfd \ 
     php71-php-pecl-memcache \ 
     php71-php-pecl-memcached \ 
     php71-php-pecl-mongodb \ 
     php71-php-pecl-redis \ 
     php71-php-pecl-request \ 
     php71-php-pecl-uploadprogress \ 
     php71-php-pecl-xattr \ 
     php71-php-pecl-zip && \ 
     yum clean all && rm -rf /tmp/yum* 

RUN rm -f /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/* /etc/httpd/conf.modules.d/* && \ 
    ln -sfF /opt/remi/php71/enable /etc/profile.d/php71-paths.sh && \ 
    ln -sfF /opt/remi/php71/root/usr/bin/{pear,pecl,phar,php,php-cgi,phpize} /usr/local/bin/. && \ 
    mv -f /etc/opt/remi/php71/php.ini /etc/php.ini && \ 
    ln -s /etc/php.ini /etc/opt/remi/php71/php.ini && \ 
    rm -rf /etc/php.d && \ 
    mv /etc/opt/remi/php71/php.d /etc/. && \ 
    ln -s /etc/php.d /etc/opt/remi/php71/php.d 

RUN curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony && \ 
    chmod a+x /usr/local/bin/symfony 

COPY container-files/

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ 
    composer global install --no-dev 

RUN yum install -y php71-php-pecl-xdebug && \ 
    yum clean all && rm -rf /tmp/yum* && \ 
    php --version 

RUN chmod +x /config/bootstrap.sh 
RUN echo 'alias sf="php bin/console"' >> ~/.bashrc 

WORKDIR /data/www 
EXPOSE 80 9001 

Вещь я все время получаю эту ошибку при попытке получить доступ к dev среды с использованием http://symfonyapp.local/app_dev.php:

php-fpm | [Sat Jan 14 15:09:27.655609 2017] [proxy_fcgi:error] [pid 13:tid 140600250660608] [client 172.18.0.1:43960] AH01071: Got error 'Unable to open primary script: /data/www/web/_wdt/210673 (No such file or directory)\n', referer: http://symfonyapp.local/app_dev.php 

Имея ошибку выше, я могу думать:

  • собственности | вопрос разрешения на /data/www/web в контейнере, который является странным, поскольку эта папка принадлежит root и хорошо .... это root мне не нужно объяснять
  • что-то не удается с Symfony3 и я м не знают об этом и я не мог найти его до сих пор
  • Apache | PHP-FPM не может писать на такую ​​папку, которая приводит к первому элементу в этом списке
  • Apache config блокирует каталог /web быть написано. (mod_scurity не работает, поэтому я не могу его обвинить)

Это то, что я пробовал до сих пор без успеха, потому что я все равно получаю ту же ошибку все время.

  1. Изменение прав собственности/разрешений в контейнере (это приводит к ошибке в Linux, так как разрешения в томах также меняются в хосте, то же самое не происходит в Windows). Ниже приводится объяснение того, как я могу достичь такой цели.

Краткое объяснение в том, как я изменяю собственность/разрешение:

php-fpm Dockerfile будет наследоваться от docker-centos7-supervisord, который имеет этот script, как ENTRYPOINT. Таким образом, я создал файл /container-files/config/init/20-permissions.sh со следующим содержанием:

#!/usr/bin/env bash 

chown -R apache:root /data/www && \ 
find /data/www -type d -print0 | xargs -0 chmod 775 && \ 
find /data/www -type f -print0 | xargs -0 chmod 664 
echo "Set up permissions finished" 

exec "[email protected]" 

Файл выше запускается на выполнение после контейнера начинается и объемы устанавливаются. Я знал, что файл выполнен, потому что я вижу Set up permissions finished в журналах контейнеров php-fpm. Это странно, потому что, хотя проверка собственности/разрешение после того, как показать мне следующее:

> docker exec -it php-fpm ls -la /data/www/web 
total 57 
drwxr-xr-x 2 root root 4096 Jan 14 03:45 . 
drwxr-xr-x 2 root root 4096 Jan 14 00:40 .. 
-rwxr-xr-x 1 root root 3319 Jan 13 23:54 .htaccess 
-rwxr-xr-x 1 root root 635 Jan 14 03:45 app.php 
-rwxr-xr-x 1 root root 1184 Jan 14 03:45 app_dev.php 
-rwxr-xr-x 1 root root 2092 Jan 13 23:54 apple-touch-icon.png 
drwxr-xr-x 2 root root  0 Dec 13 13:36 bundles 
-rwxr-xr-x 1 root root 21244 Jan 14 00:04 config.php 
-rwxr-xr-x 1 root root 6518 Jan 13 23:54 favicon.ico 
-rwxr-xr-x 1 root root 116 Jan 13 23:54 robots.txt 

Так что в этом случае я не уверен, если это будет хорошо или, если это возможно даже. Я создал репозиторий с двумя ветвями со всеми необходимыми для этого попытками: master с httpd и php-fpm как в одном контейнере, так и в httpd, имеющем их в отдельных контейнерах.Хотя результат в обоих случаях одинаковый.

Чтобы получить все и работает, вы должны:

  • Run docker-compose up -d --build --force-recreate (--force,---build воссоздать естественную не нужны, но на всякий случай)
  • Run docker exec -it php-fpm composer update так что вы скачать библиотеки, необходимые для проекта.
  • Добавить symfonyapp.local ваших хостов файлы

В настоящее время я использую Docker в Windows, это информация о нем:

Version: 1.13.0-rc6-beta36 (9696) 
Channel: Beta 
Sha1: 64a715b54327a0ec8f28076d1a343f4c811856fb 
Started on: 2017/01/13 18:34:34.519 
Resources: C:\Program Files\Docker\Docker\Resources 
OS: Windows 10 Pro 
Edition: Professional 
Id: 1607 
Build: 14393 
BuildLabName: 14393.693.amd64fre.rs1_release.161220-1747 

Но я испытал это в Linux, так и у меня есть такое же поведение означает, что ошибка все еще существует.

Что здесь происходит? Можете ли вы дать мне несколько идей или решений? На данный момент я из них и не знаю, что еще делать.

+0

После нашего чата я кругом вернулся сегодня вечером и построил контейнеры с новой проверкой вашего репетитора github. Кажется, что теперь он правильно управляет каталогом. Если вы это выяснили, могу ли я предложить вам опубликовать ваши выводы в качестве вашего собственного ответа? Это может помочь будущим читателям ... –

+0

@ DanLowe вы можете запустить приложение без ошибки? Потому что я не мог, и поэтому я пытаюсь настроить разрешения ... и, кстати, это «очевидно» работает только тогда, когда Docker запускается в Windows, потому что, если я разрешаю разрешения на Linux, это превращается в беспорядок. – ReynierPM

+0

. m не знаю, для чего ваше приложение, честно, но я смог получить что-то ответное (он в настоящее время находится в Интернете по адресу http://104.236.22.228:81/) - странице Kibana. Это то, чего вы ожидаете? Мне пришлось изменить размер моей цифровой капли воды, где я тестировал. У экземпляра 512 Мбайт недостаточно памяти, и mysql не запускался. Капля 2 ГБ прошла нормально, хотя ... –

ответ

1

После проведенных дней и часов, пытаясь получить эту работу, я, наконец, получил это благодаря каналу Symfony #support в Slack и следующим каналам на IRC#symfony, #httpd, #php, #docker и, наконец, не последним на @DanLowe, который находит время, чтобы найти решение и помочь мне решить проблему.

Обстоятельства | мысли:

  • Есть вопрос Symfony 3.2.2 ... не
  • Является ли Docker работает на Windows ... не
  • Является разрешений в каталоге /web ... не
  • Проблема с PHP-FPM ... не
  • является (HTTPD) проблема Apache ... не

Проблемы: Конфигурация пропуска в PHP (.ini файл) из-за копию & паста из установки Nginx быть используется с Apache (ранее я использовал Nginx, а затем перешел в Apache, оставив PHP-настройку, как было).

// this work in Nginx but does not work in Apache 
// cgi.fix_pathinfo is required to get PHP to adhere to the CGI spec 

; Fix the cgi.fix_pathinfo directive 
cgi.fix_pathinfo = 0 

По умолчанию эта строка комментируется в файле php.ini. Но ждет, что это может быть проблемой, когда PHP использует FastCGI и ProxyPass и так далее .... ну да (я его где-то читал) и нет (если вы исследуете и настраиваете свой сервер, как и должно быть). Решение проблемы выше закомментируйте линии, как это по умолчанию:

; Fix the cgi.fix_pathinfo directive 
; cgi.fix_pathinfo = 0 

решение «безопасность» нарушения, введенные выше, и я цитировал here:

Если вы иметь последнюю версию PHP-FPM (~ 5.3.9 +?), тогда вам нужно ничего не делать, так как безопасное поведение ниже уже по умолчанию.

В противном случае найдите www. Php-fpm www.conf файл (возможно, /etc/php-fpm.d/www.conf, зависит от вашей системы). Убедитесь, что у вас есть это:

security.limit_extensions = .php

Опять же, это по умолчанию во многих местах в эти дни.

В моем случае я использую PHP 7.1, но даже при том, что я защитил свой сервер, добавив такую ​​строку в свой /etc/php-fpm.d/www.conf.

3

TL; DR: Проблема разрешения вводится в течение composer update. Возможно, во время одного из скриптов (список которых можно найти в composer.json).

Я начал с нуля на виртуальной машине с вашим репозиторием и следил за инструкциями по запуску.

git clone https://github.com/reypm/symfony3app 
cd symfony3app 
docker-compose up -d --build --force-recreate 

На данный момент, Чаун от 20-permissions.sh должен был бежать. Чтобы убедиться в этом, я заглянул внутрь контейнера. Ошибка, которую я видел, связана с /data/www/var/cache/dev, поэтому я просмотрел разрешения на каждый каталог этого пути.

[my-vm]# docker-compose exec php-fpm bash 
[container]# ls -la /data/www{,/var{,/cache{,/dev}}} 

ls: cannot access /data/www/var/cache/dev: No such file or directory 
/data/www: 
total 168 
drwxrwsr-x 8 apache root 4096 Jan 15 19:26 . 
drwxr-xr-x 8 root root 4096 Jan 15 19:27 .. 
-rw-rw-r-- 1 apache root 248 Jan 15 19:26 .gitignore 
-rw-rw-r-- 1 apache root  74 Jan 15 19:26 README.md 
drwxrwsr-x 5 apache root 4096 Jan 15 19:27 app 
drwxrwsr-x 2 apache root 4096 Jan 15 19:26 bin 
-rw-rw-r-- 1 apache root 2387 Jan 15 19:26 composer.json 
-rw-rw-r-- 1 apache root 119533 Jan 15 19:26 composer.lock 
-rw-rw-r-- 1 apache root 978 Jan 15 19:26 phpunit.xml.dist 
drwxrwsr-x 3 apache root 4096 Jan 15 19:26 src 
drwxrwsr-x 3 apache root 4096 Jan 15 19:26 tests 
drwxrwsr-x 4 apache root 4096 Jan 15 19:26 var 
drwxrwsr-x 2 apache root 4096 Jan 15 19:26 web 

/data/www/var: 
total 52 
drwxrwsr-x 4 apache root 4096 Jan 15 19:26 . 
drwxrwsr-x 8 apache root 4096 Jan 15 19:26 .. 
-rw-rw-r-- 1 apache root 34272 Jan 15 19:26 SymfonyRequirements.php 
drwxrwsr-x 2 apache root 4096 Jan 15 19:26 cache 
drwxrwsr-x 2 apache root 4096 Jan 15 19:26 sessions 

/data/www/var/cache: 
total 8 
drwxrwsr-x 2 apache root 4096 Jan 15 19:26 . 
drwxrwsr-x 4 apache root 4096 Jan 15 19:26 .. 
-rw-rw-r-- 1 apache root 0 Jan 15 19:26 .gitkeep 

Пока что так хорошо. Chown установил все на apache:root и использовал режимы, указанные в скрипте.

Затем я вышел из контейнера и выполнил обновление композитора.

docker-compose exec php-fpm composer update 

При появлении запроса я использовал параметры базы данных, которые я нашел в git repo, и все установлено нормально. Затем я вернулся в контейнер, чтобы узнать, изменились ли разрешения.

[my-vm]# docker-compose exec php-fpm bash 
[container]# ls -la /data/www{,/var{,/cache{,/dev}}} 

/data/www: 
total 164 
drwxrwsr-x 9 apache root 4096 Jan 15 19:20 . 
drwxr-xr-x 8 root root 4096 Jan 15 19:18 .. 
-rw-rw-r-- 1 apache root 248 Jan 15 19:17 .gitignore 
-rw-rw-r-- 1 apache root  74 Jan 15 19:17 README.md 
drwxrwsr-x 5 apache root 4096 Jan 15 19:18 app 
drwxrwsr-x 2 apache root 4096 Jan 15 19:21 bin 
-rw-rw-r-- 1 apache root 2387 Jan 15 19:17 composer.json 
-rw-rw-r-- 1 apache root 114331 Jan 15 19:20 composer.lock 
-rw-rw-r-- 1 apache root 978 Jan 15 19:17 phpunit.xml.dist 
drwxrwsr-x 3 apache root 4096 Jan 15 19:17 src 
drwxrwsr-x 3 apache root 4096 Jan 15 19:17 tests 
drwxrwsr-x 5 apache root 4096 Jan 15 19:21 var 
drwxr-sr-x 25 root root 4096 Jan 15 19:21 vendor 
drwxrwsr-x 3 apache root 4096 Jan 15 19:21 web 

/data/www/var: 
total 96 
drwxrwsr-x 5 apache root 4096 Jan 15 19:21 . 
drwxrwsr-x 9 apache root 4096 Jan 15 19:20 .. 
-rw-rw-r-- 1 apache root 34272 Jan 15 19:21 SymfonyRequirements.php 
-rw-r--r-- 1 root root 39637 Jan 15 19:21 bootstrap.php.cache 
drwxrwsr-x 3 apache root 4096 Jan 15 19:21 cache 
drwxr-sr-x 2 root root 4096 Jan 15 19:21 logs 
drwxrwsr-x 2 apache root 4096 Jan 15 19:17 sessions 

/data/www/var/cache: 
total 12 
drwxrwsr-x 3 apache root 4096 Jan 15 19:21 . 
drwxrwsr-x 5 apache root 4096 Jan 15 19:21 .. 
-rw-rw-r-- 1 apache root 0 Jan 15 19:17 .gitkeep 
drwxr-sr-x 4 root root 4096 Jan 15 19:21 dev 

/data/www/var/cache/dev: 
total 636 
drwxr-sr-x 4 root root 4096 Jan 15 19:21 . 
drwxrwsr-x 3 apache root 4096 Jan 15 19:21 .. 
-rw-r--r-- 1 root root  90 Jan 15 19:21 annotations.map 
-rw-r--r-- 1 root root 277718 Jan 15 19:21 appDevDebugProjectContainer.php 
-rw-r--r-- 1 root root 38062 Jan 15 19:21 appDevDebugProjectContainer.php.meta 
-rw-r--r-- 1 root root 213247 Jan 15 19:21 appDevDebugProjectContainer.xml 
-rw-r--r-- 1 root root 84170 Jan 15 19:21 appDevDebugProjectContainerCompiler.log 
-rw-r--r-- 1 root root 4790 Jan 15 19:21 classes.map 
drwxr-sr-x 3 root root 4096 Jan 15 19:21 doctrine 
drwxr-sr-x 4 root root 4096 Jan 15 19:21 pools 

Как вы можете видеть, некоторые вещи теперь принадлежат root:root. Насколько я могу судить, это просто потому, что сам контейнер работает как root. Поэтому, когда вы выполняете задание внутри, это задание выполняется как root. Поэтому все, что он создает, по умолчанию принадлежит root.

Между тем, Apache работает как пользовательский «apache», потому что это то, что настроено супервизор.

Есть, вероятно, более элегантные исправления этой проблемы, но этот был самый простой один я придумал:

docker-compose exec php-fpm chown -R apache:root /data/www/var/cache 
docker-compose restart php-fpm 

После этого, приложение возвращает

Добро пожаловать в Symfony 3.2 .2

Ваша заявка готова. Вы можете приступить к работе над этим: /data/www/

Я не пытался ничего исправить, чем это. Но мое предложение состояло бы в том, чтобы попытаться запустить загрузку компоновщика для запуска и выполнить chown-работу после этого. Вам, вероятно, не нужно кормить всех /data/www, так как Apache, вероятно, не нуждается в написании писем во всем. Я предполагаю, что каталог кеша - это одно место, которое нужно написать, поэтому я проделал этот путь.

+0

Это отличная работа, но проблема не возникает из '/ var', а из'/web'. Если вы посмотрите на опубликованную ошибку, то говорится, что каталог '_wdt' не может быть создан в'/web'. Я попытался установить права доступа к 'apache: root' в этом каталоге после, но это не сработает. Если я перезапущу контейнер, это худшее, потому что php-fpm, похоже, запускается, как и должно быть, и я не могу доступ к контейнеру больше :-(Если вы попробуете еще раз сделать это, используя [эту ветку] (https://github.com/reypm/symfony3app/tree/httpd), у меня есть отделенные службы там – ReynierPM

+0

Также я сделал несколько изменения в OP и в репозитории, один из них - «chown apache: root/usr/local/bin/composer», надеясь, что это создаст файлы под пользователем apache, но этот подход тоже не сработал. – ReynierPM

 Смежные вопросы

  • Нет связанных вопросов^_^