Как исправить ошибку Doctrine \\ DBAL \\ Driver \\ PDOException в докере с приложением laravel 5 - PullRequest
0 голосов
/ 31 октября 2018

У меня проблема с запуском моего приложения Laravel 5.5 / Postgres в Docker. Я вижу эту ошибку в моих журналах:

не удалось найти драйвер {"исключение": "[объект] (Doctrine \ DBAL \ Driver \ PDOException

обычно, чтобы исправить эту ошибку, я должен запустить консоль моего Ubuntu:

composer require doctrine/dbal

У меня есть в файле docker-compose.yml :

...
    lprods_composer:
        image: composer:1.6
        container_name: lprods_composer_container
        volumes:
            - ${APP_PATH_HOST}:${APP_PTH_CONTAINER}
        working_dir: ${APP_PTH_CONTAINER}
        command: composer install  --ignore-platform-reqs

Каким способом можно спасти это? Я полагаю, мне нужно установить эту опцию в моем файле docker-compose.yml?

МОДИФИЦИРОВАННЫЙ БЛОК № 2

Я попытался решить эту проблему следующим образом: В composer.json проекта я добавил "doctrine/dbal": "~2.5" объявление под "require" и теперь этот файл:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "barryvdh/laravel-debugbar": "^2.3",
        "graham-campbell/markdown": "^8.0",
        "intervention/image": "^2.3",
        "khill/lavacharts": "3.0.*",
        "laravel/framework": "5.5.*",
        "laravel/socialite": "^3.0",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "^5.4.0",
        "nwidart/laravel-modules": "^2.2",
        "doctrine/dbal": "~2.5",
        "wboyz/laravel-enum": "^0.2.1"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~6.0",
        "stolz/laravel-html-tidy": "^0.1.1",
        "xethron/migrations-generator": "^2.0",
        "filp/whoops" : "~2.0" 
    },
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "Modules\\": "Modules/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ],

        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover"
        ]

    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    }
}

Я пересобрал приложение, очистил кеш, но, запустив приложение, я получил ошибки в файле журнала:

[2018-11-01 12:40:09] local.ERROR: не удалось найти драйвер {"исключение": "[объект] (Doctrine \ DBAL \ Driver \ PDOException (код: 0):

не удалось найти драйвер в /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:47, PDOException (код: 0): не удалось найти драйвер в / var / WWW / HTML / поставщик / доктрина / DBAL / Библиотека / Doctrine / DBAL / Водитель / PDOConnection.php: 43) [StackTrace]

# 0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(64): Doctrine \ DBAL \ Driver \ PDOConnection -> __ construct ('pgsql: host = 127 .... ',' postgres ',' 1 ', Array)

# 1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(43): Illuminate \ Database \ Connectors \ Connector-> createPdoConnection ('pgsql: host = 127 .... ',' postgres ',' 1 ', Array)

# 2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/PostgresConnector.php(33): Illuminate \ Database \ Connectors \ Connector-> createConnection ('pgsql: host = 127 .... ', Array, Array)

# 3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(183): Осветить \ База данных \ Соединители \ PostgresConnector-> connect (Array)

# 4 [внутренняя функция]: Подсветка \ База данных \ Соединители \ ConnectionFactory-> Подсветка \ База данных \ Коннекторы \ {closure} () ...

1) Было ли мое заявление недействительным?

2) Я попытался запустить в своей коробке контейнера, но получил:

# composer require doctrine/dbal
bash: composer: command not found

Я полагаю, что в моем контейнере я могу попытаться установить composer, но так ли это?

Что бы вы посоветовали?

МОДИФИЦИРОВАННЫЙ БЛОК # 3 Я пытался следовать твоему шагу и с контентом в файле web / Dockerfile.yml

FROM composer:1.7

RUN apk --no-cache add postgresql-dev && docker-php-ext-install pgsql pdo_pgsql

Мне удалось сделать успешную компиляцию:

$ docker-compose up -d --build
Creating network "lprods_docker_default" with the default driver
Building lprods_app
Step 1/2 : FROM composer:1.7
 ---> 3f6a33c5e9d9
Step 2/2 : RUN apk --no-cache add postgresql-dev && docker-php-ext-install pgsql pdo_pgsql

... /* LONG OUTPUT */

(21/23) Purging mpfr3 (3.1.5-r1)
(22/23) Purging isl (0.18-r0)
(23/23) Purging gmp (6.1.2-r1)
Executing busybox-1.28.4-r1.trigger
OK: 120 MiB in 66 packages
Removing intermediate container 37d149da2e44
 ---> d3029f0a2f29
Successfully built d3029f0a2f29
Successfully tagged lprods_docker_lprods_app:latest
Creating lprods_docker_lprods_app_1      ... done
Creating lprods_docker_lprods_db_1       ... done
Creating lprods_docker_lprods_composer_1 ... done
Creating lprods_docker_lprods_adminer_1  ... done

Но затем мне не удалось войти в поле:

$ docker-compose exec lprods_app bash
ERROR: No container found for lprods_app_1
$ docker-compose exec lprods_app_1 bash
ERROR: No such service: lprods_app_1
$ docker-compose exec lprods_docker_lprods_app_1 bash
ERROR: No such service: lprods_docker_lprods_app_1
$ docker-compose exec lprods_docker_lprods_app bash
ERROR: No such service: lprods_docker_lprods_app
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
lprods_docker_lprods_app   latest              d3029f0a2f29        5 minutes ago       180MB
<none>                     <none>              3c5cdf1cd86d        About an hour ago   388MB
composer                   1.7                 3f6a33c5e9d9        7 days ago          156MB
votes_docker_votes_app     latest              cdfca8c44268        7 days ago          413MB
adminer                    latest              e07e38f6e446        2 weeks ago         81.6MB
mysql                      5.6.41              085b9b6ec8a9        3 weeks ago         256MB
php                        7.1-apache          93e6fb4b13e1        3 weeks ago         369MB
php                        7.2-apache          cf1a377ba77f        3 weeks ago         377MB
composer                   1.6                 eea351f3627d        3 weeks ago         155MB
postgres                   9.6.10-alpine       5433943ddb9f        8 weeks ago         38.6MB
hello-world                latest              e38bc07ac18e        7 months ago        1.85kB
composer/composer          latest              5afb0951f2a4        2 years ago         636MB

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                         PORTS                    NAMES
0f79ebc93d62        adminer                  "entrypoint.sh docke…"   6 minutes ago       Up 6 minutes                   0.0.0.0:8083->8080/tcp   lprods_docker_lprods_adminer_1
caed5c2ae860        postgres:9.6.10-alpine   "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes                   0.0.0.0:5433->5432/tcp   lprods_docker_lprods_db_1
2f73a600b999        adminer                  "entrypoint.sh docke…"   7 days ago          Up 2 hours                     0.0.0.0:8082->8080/tcp   votes_docker_adminer_1
52ea479b8791        mysql:5.6.41             "docker-entrypoint.s…"   7 days ago          Restarting (1) 4 seconds ago                            votes_docker_db_1

Почему ошибка и какое имя контейнера я должен использовать?

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Композитор не поддерживает расширение pgsql.

Это можно проверить, перечислив скомпилированные модули.

docker-compose exec service php -m

В списке скомпилированных модулей, выведенных на stderr, pgsql и pdo_pgsql должны отсутствовать.

Вы можете найти изображение в реестре Docker, которое поставляется с composer, php с расширениями pgsql & pdo_pgsql и даже Laravel (убедитесь, что оно из надежного источника).

Теперь, если вы хотите продолжить с composer в качестве базового изображения. В остальной части этого ответа приведены шаги для этого.

Пока вы можете выполнить сеанс bash в работающем контейнере и установить необходимые расширения; это изменение сохраняется только в течение всего времени существования этого экземпляра контейнера.

Я предлагаю более длительную конфигурацию, которая включает в себя создание образа для обслуживания. В этой конфигурации Dockerfile для создания образа; необходимые расширения установлены .

ПРИМЕЧАНИЕ о том, что в следующих примерах кода вы должны заменить название своей услуги например, lprods_composer

.Dockerfile

FROM composer:1.7

RUN apk --no-cache add postgresql-dev && docker-php-ext-install pgsql pdo_pgsql

Этот <service>.Dockerfile может использоваться в определении сервиса в docker-compose.yaml.

<service>:
  build: 
    context: ./
    dockerfile: <service>.Dockerfile

Также не забудьте настроить параметры подключения для подключения к вашей базе данных Postgres. Это может быть предусмотрено в любой из environment и env_file конфигураций.

Проверьте, что ваша конфигурация прошла успешно, запустив тестовый запрос в tinker

Запустить повозку REPL

docker-compose exec service php artisan tinker

Затем выполните этот запрос в REPL

DB::connection()->query()->selectRaw("version();")->get()

При успешной настройке должна быть выведена версия запущенного postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...