【问题标题】:Console PHP script runs differently when executes through docker exec or through PhpStorm通过 docker exec 或 PhpStorm 执行时,控制台 PHP 脚本的运行方式不同
【发布时间】:2017-01-18 12:34:16
【问题描述】:

我正在尝试通过 PhpStorm 运行控制台运行 Doctrine 2 的控制台脚本。 Docker 设置为 Deploy 服务器。

如果我运行这个:

$ docker exec container_name /var/www/vendor/bin/doctrine-module orm:schema-tool:create

打印出来:

没有要处理的元数据类。

但是当我在 PhpStorm 中运行 PHP 运行/调试配置时: 文件:/home/username/PhpstormProjects/proj/vendor/bin/doctrine-module

打印出来:

docker://image_name/container_name /var/www/vendor/bin/doctrine-module

致命错误:未捕获的 PDOException: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/vendor/zendframework/zend-servicemanager/src/ServiceManager.php on line 765

Zend\ServiceManager\Exception\ServiceNotCreatedException:无法创建名为“doctrine.connection.orm_default”的服务。原因:驱动发生异常:SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/vendor/zendframework/zend-servicemanager/src/ServiceManager.php on line 765

调用堆栈: 0.0001 349368 1. {main}() /var/www/vendor/doctrine/doctrine-module/bin/doctrine-module:0 0.0268 360480 2. 包含('/var/www/vendor/doctrine/doctrine-module/bin/doctrine-module.php')/var/www/vendor/doctrine/doctrine-module/bin/doctrine-module:4 0.9376 4076096 3. Zend\ServiceManager\ServiceManager->get() /var/www/vendor/doctrine/doctrine-module/bin/doctrine-module.php:61 0.9376 4076096 4. Zend\ServiceManager\ServiceManager->doCreate() /var/www/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:200

进程以退出代码 255 结束

我检查了在创建 PDO 时它接收到的参数完全相同

new PDO("mysql:host=db;port=3306;dbname=dbname", "user", "pass", [])

docker-compose.yml:

version: '2'
services:
    nginx:
        container_name: nginx
        build:
            context: .
            dockerfile: DockerfileNginx
        ports:
            - "80:80"
        depends_on:
            - php
        working_dir: /var/www
        links:
            - php
        volumes:
            - .:/var/www
        links:
            - db
    php:
        container_name: php
        build:
            context: .
            dockerfile: DockerfilePhp
            - db
        volumes:
            - .:/var/www
        expose:
            - "9000"
        depends_on:
            - db
    db:
        container_name: db
        image: "mysql:5.6"
        ports:
            - "3306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: pass
            MYSQL_DATABASE: dbname
            MYSQL_USER: user
            MYSQL_PASSWORD: pass

【问题讨论】:

  • 我猜你应该在连接字符串中使用 localhost 而不是 db,因为 PHPStorm 是从外部容器运行的: new PDO("mysql:host=localhost;port=3306;dbname=dbname", "用户”,“通过”,[]);这应该可以工作,因为您已经映射了“3306:3306”(顺便说一句之后有一个奇怪的字符)
  • PHPStorm 在容器内执行测试。主机“db”是正确的。

标签: php docker pdo phpstorm


【解决方案1】:

我遇到了同样的问题,我发现 PHPStorm 为您的 PHP 调用启动了一个新的专用 Docker 容器。因此,此时您的所有 docker-compose 配置都丢失了。

我做了以下事情:

  • 使用 compose 启动 Docker 堆栈
  • 然后使用 docker network ls 找到您的网络名称(请参阅 Cannot link to a running container started by docker-compose 以获取帮助)
  • 在 PHPStorm 中,转到您对 Docker 容器的首选项(语言和框架 -> PHP -> PHPUnit:Docker 容器 ...)并添加一个指向您的数据库的链接(例如:name = your_containter_name_1,alias = db)并更改从网桥到您的网络名称的网络模式

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2014-08-20
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多