如何使用 laravel 5 应用程序修复 docker 中的 Doctrine\\DBAL\\Driver\\PDOException 错误

5 laravel-5 docker-compose

我在 Docker 中运行 Laravel 5.5/Postgres 应用程序时遇到问题。我在日志中看到此错误:

找不到驱动程序 {"exception":"[object] (Doctrine\DBAL\Driver\PDOException

通常要修复此错误,我必须在 ubuntu 的控制台中运行:

composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)

我在文件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
Run Code Online (Sandbox Code Playgroud)

用什么方法解救它?我想我必须在我的 docker-compose.yml 文件中设置这个选项?

修改后的块 #2

我试图解决这个问题,如下:在composer.json我在项目中添加了"doctrine/dbal": "~2.5"声明"require",现在这个文件是:

composer require doctrine/dbal
Run Code Online (Sandbox Code Playgroud)

我重建了应用程序,清除了缓存,但运行该应用程序时,我在日志文件中遇到了错误:

[2018-11-01 12:40:09] local.ERROR: 找不到驱动程序 {"exception":"[object] (Doctrine\DBAL\Driver\PDOException(code: 0):

在 /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:47, PDOException(code: 0): 找不到驱动程序:在 /var/www/html 找不到驱动程序/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/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', 数组)

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

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

#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(183): Illuminate\Database\Connectors\PostgresConnector->connect(Array)

#4 [内部函数]:Illuminate\Database\Connectors\ConnectionFactory->Illuminate\Database\Connectors\{closure}() ...

1) 我的声明是否无效?

2)我试图在我的容器盒中运行,但得到:

# composer require doctrine/dbal
bash: composer: command not found
Run Code Online (Sandbox Code Playgroud)

我想在我的容器盒中我可以尝试安装 composer ,但这是正确的方法吗?

你有什么建议?

MODIFIED BLOCK #3 我试着按照你的步骤和 web/Dockerfile.yml 文件中的内容

FROM composer:1.7

RUN apk --no-cache add postgresql-dev && docker-php-ext-install pgsql pdo_pgsql
Run Code Online (Sandbox Code Playgroud)

我设法成功编译:

$ 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
Run Code Online (Sandbox Code Playgroud)

但接下来我没有进入框:

$ 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
Run Code Online (Sandbox Code Playgroud)

为什么出现错误以及我必须使用哪个容器名称?

谢谢!

Olu*_*ule 3

作曲家映像不\xe2\x80\x99t 运送pgsql

\n\n

这可以通过列出编译的模块来验证。

\n\n
docker-compose exec service php -m\n
Run Code Online (Sandbox Code Playgroud)\n\n

在输出到的编译模块列表中stderr,\npgsqlpdo_pgsql应该丢失。

\n\n

您可能会在 Docker 注册表中找到一个映像,该映像附带了 Composer、带有 pgsql 和 pdo_pgsql 扩展的 php,甚至 Laravel(请验证它是否来自可信来源)。

\n\n

现在,如果您想继续composer作为基础图像。本答案的其余部分提供了相应的步骤。

\n\n

虽然您可以在正在运行的容器中执行 bash 会话并\n安装所需的扩展;此更改仅在该容器实例的生命周期内持续存在。

\n\n

我建议采用更持久的配置,其中包括为服务构建\n映像。在此 Dockerfile 配置中构建镜像;所需的扩展已安装

\n\n

请注意,在以下代码示例中,您应该替换为您的服务的名称,例如 lprods_composer

\n\n

.Dockerfile

\n\n
FROM composer:1.7\n\nRUN apk --no-cache add postgresql-dev && docker-php-ext-install pgsql pdo_pgsql\n
Run Code Online (Sandbox Code Playgroud)\n\n

<service>.Dockerfile可以在服务定义中使用docker-compose.yaml

\n\n
<service>:\n  build: \n    context: ./\n    dockerfile: <service>.Dockerfile\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请记住配置用于连接 Postgres 数据库的连接参数。\n这可以在以下任何一个中提供environmentenv_file中提供。

\n\n

通过在 Tinker 中运行测试查询来测试您的配置是否成功

\n\n

启动修补程序 REPL

\n\n
docker-compose exec service php artisan tinker\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在REPL中执行这个查询

\n\n
DB::connection()->query()->selectRaw("version();")->get()\n
Run Code Online (Sandbox Code Playgroud)\n\n

成功的配置应该输出正在运行的 postgres 的版本。

\n