【问题标题】:Running PHPUnit within a Docker container with PhpStorm使用 PhpStorm 在 Docker 容器中运行 PHPUnit
【发布时间】:2016-02-04 07:12:52
【问题描述】:

我想配置我的 PhpStorm IDE 以在我的 Docker 容器中运行 PHPUnit 测试。

似乎我只能使用本地 PHP 可执行文件或通过 SSH 的可执行文件作为测试的解释器。

我可以在我的 PHP 容器上安装 SSH 服务,但它似乎有点笨拙,网上的文章不鼓励在容器上安装 SSH 服务。

为了尝试让本地解释器正常工作,我尝试创建一个 bash 脚本来代理容器内的 PHP 调用,如下所示:

#!/usr/bin/env bash

# Run PHP through Docker
docker exec -t mycontainer_php_1 php "$@"

当我自己运行它时效果很好,但是当我将 PhpStorm 指向它作为本地 PHP 解释器时,它不会将其识别为有效的 PHP 可执行文件。

那么有什么好方法可以让它工作呢?

【问题讨论】:

  • "... 它无法将其识别为有效的 PHP 可执行文件。" 这是因为 IDE 需要解释器的某些(标准)输出来验证其版本和设置。在这方面我可能会推荐:1)首先使用真正的php在PhpStorm中创建PHP解释器(或按原样将所有参数传递给php); 2) 一旦它被添加到 PhpStorm,改变你的脚本来使用你的 docker。附言新发布的 v10 对 Docker 有一些支持——你看到了吗?它可以满足您的需求吗?
  • 由于我在Docker中代理php,理论上它也应该能够通过调用我给的脚本和--version来确定版本。你是说我应该尝试通过将 PHPStorm 指向一个真正的本地 php 解释器来欺骗它,以便它识别它,然后将它换成 bash 脚本?我安装了 PHPStorm 10,但它似乎唯一的 Docker 功能是与部署相关的。
  • 是的,这就是我的想法。但是如果你想得更远一点..它很可能不会工作(我的意思是后者——运行 PHPUnit 测试),因为 IDE 使用帮助脚本进行集成(它需要以某种方式部署在那里,除非它是自动完成的) + 路径很可能与本地路径不同...
  • 这将是下一个问题。现在我只想让 PHPStorm 能够识别在 Docker 中运行的 PHP 可执行文件。
  • 我会使用 SSH 方法。没有什么“hacky”,它是如何与 vagrant box 一起工作的。它更加强大,经过 JetBrains 和用户的测试。我认为在 dev 机器上的容器中安装 sshd 并没有什么坏处。

标签: php docker phpunit phpstorm


【解决方案1】:

PhpStorm 现在拥有 better integration with Docker engine(包括 Mac 版 Docker),您现在只需执行以下操作(或 read this article):

命令行:

  1. 拉取phpunit Docker 镜像: docker pull phpunit/phpunit
  2. (Mac 和 Windows) 将 Docker 套接字桥接到 API_URL socat -d TCP-LISTEN:2376,range=127.0.0.1/32,reuseaddr,fork UNIX:/var/run/docker.sock

然后是 Phpstorm:

  1. 配置与 Docker 引擎的连接:
    • 转到设置 -> 构建、执行、部署 -> Docker
    • 创建一个新的 Docker 配置,将API URL 设置为:
      • Linux:unix:///var/run/docker.sock
      • Windows 和 Mac:http://127.0.0.1:2376tcp://localhost:2376
  2. 配置远程解释器:
    • 转到 设置 -> 语言和框架 -> PHP
    • 通过以下方式创建一个新的 PHP CLI 解释器:
      • 点击...,然后点击+ 和“远程...”
      • 选择 Docker
        • 服务器图像:
        • 图片名称:phpunit/phpunit:latest
        • PHP 可执行文件:php
  3. 配置 Phpunit:
    • 转到 设置 -> 语言和框架 -> PHP -> PHPUnit
    • 创建新的 Phpunit 配置(+ 然后“通过远程解释器...”并选择
    • 设置Use Composer Autoloader
    • 脚本路径:/opt/project/vendor/autoload.php
    • 默认配置文件:/opt/project/phpunit.xml.dist
  4. 尝试运行您的测试!

【讨论】:

    【解决方案2】:

    这行得通:

    DIR=$(dirname $(readlink -f "$0"))
    docker run --rm --sig-proxy=true -v ${DIR}:${DIR} -w ${DIR} --pid=host php:cli php "$@"
    

    只要把它放在某个文件中,chmod +x it => 刚刚用想法测试过并且被识别得很好:)

    真正让所有 phpstorms 帮助脚本工作的技巧是挂载 php 可执行文件所在的目录。 如果此脚本不在您的 phpunit 可执行文件和源代码的文件夹中,您必须扩展它以安装它们。

    (这里的重要说明:它们必须安装到容器和主机 obv 中的同一文件夹:))

    几个月后编辑,但可能对某些人有帮助: 在这里使用 WordPress 示例解决了这个问题: http://original-brownbear.github.io/2015/12/23/phpunit-docker-phpstorm.html

    【讨论】:

    • 感谢您的回答。我有一个担心。你是说我应该在一个新的、单独的容器中运行 php。我担心这个 PHP 不会打开与我已经运行的 php-fpm 容器中相同的设置,并且到目前为止我一直在手动运行 phpunit。
    • 公平点 :) 我的意思是你在这里有多种选择,最简单的可能是简单地用你的 php-fpm 容器在我看来运行的图像替换 php:cli。那怎么样?
    • 即使是同一个镜像,它也不会使用我已经在 docker-compose.yml 中配置的所有挂载。我主要担心这个。如果有一种可靠的方法来复制它,那可能足以保证我允许使用单独的容器来运行测试。
    • 你能在这里详细说明一下吗?这只是关于数量还是关于链接(网络)?如果是前者,则对上述脚本的调整将是微不足道的。对于联网,解决方案变得更加复杂,我只想在必要时用解决方案修改上述内容:)
    • 也是这样,但更多的是我所拥有的,例如为我当前的 php-fpm 引用的环境文件,我想使用相同的环境变量。我也有一个自定义的 php.ini。有几件类似的事情,我想确保使用完全相同的东西。
    【解决方案3】:

    我知道你说你听说 docker 容器中的 ssh 很糟糕,但我认为由于 PhpStorm 不支持 docker 的 exec 来远程运行脚本,所以这不是一个糟糕的选择。您可以在 PhpStorm 中使用 SSH 将 docker 容器设置为远程 php 解释器,然后只需设置远程 PHPUnit 配置。

    您可以在此处查看分步指南:
    https://mickadoo.github.io/php,phpunit,docker/2016/10/12/phpunit-docker.html

    更新:您不再需要使用 SSH。 PhpStorm 现在支持 docker,您只需使用 PHP docker 镜像并将 PHPUnit 安装为远程解释器即可运行 PHP 单元测试。

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2018-09-02
      • 2019-04-12
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2017-12-31
      • 1970-01-01
      相关资源
      最近更新 更多