spatie/docker

在您的PHPUnit测试中运行docker容器

1.13.0 2024-05-27 09:45 UTC

This package is auto-updated.

Last update: 2024-08-27 10:18:53 UTC


README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

此包提供了一种启动docker容器并在其上执行命令的便捷方式。

$containerInstance = DockerContainer::create($imageName)->start();

$process = $containerInstance->execute('whoami');

$process->getOutput(); // returns the name of the user inside the docker container

支持我们

我们投入了大量资源来创建一流的开源软件包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄来明信片,说明您正在使用我们哪些软件包。您可以在我们的联系方式页面找到我们的地址。我们将发布所有收到的明信片在我们的虚拟明信片墙上

安装

您可以通过composer安装此包

composer require spatie/docker

用法

您可以使用以下方法获取docker容器的一个实例

$containerInstance = DockerContainer::create($imageName)->start();

默认情况下,容器将以守护进程方式运行,并在退出后进行清理。

自定义docker容器

防止守护进程化

如果您不希望您的docker守护进程化,请调用doNotDaemonize

$containerInstance = DockerContainer::create($imageName)
    ->doNotDaemonize()
    ->start();

防止自动清理

如果您不希望容器存在后进行清理,请调用doNotCleanUpAfterExit

$containerInstance = DockerContainer::create($imageName)
    ->doNotCleanUpAfterExit()
    ->start();

特权

如果您希望docker具有特权,请调用privileged

$containerInstance = DockerContainer::create($imageName)
    ->privileged()
    ->start();

自定义shell

如果您的docker镜像中不可用bash shell,您可以指定一个替代shell。

$containerInstance = DockerContainer::create($imageName)
    ->shell('sh')
    ->start();

自定义docker二进制文件

如果docker二进制文件在全局不可用,您可以指定确切路径。

$containerInstance = DockerContainer::create($imageName)
    ->dockerBin('/usr/local/bin/docker')
    ->start();

命名容器

您可以通过将名称作为构造函数的第二个参数传递来命名容器。

new DockerContainer($imageName, $nameOfContainer);

或者,使用name方法。

$containerInstance = DockerContainer::create($imageName)
    ->name($yourName)
    ->start();

映射端口

您可以使用mapPort方法在主机机器和docker容器之间映射端口。要映射多个端口,只需多次调用mapPort

$containerInstance = DockerContainer::create($imageName)
    ->mapPort($portOnHost, $portOnContainer)
    ->mapPort($anotherPortOnHost, $anotherPortOnContainer)
    ->start();

端口映射的默认协议是TCP。如果您想使用UDP,您可以将其作为第三个参数传递。

$containerInstance = DockerContainer::create($imageName)
    ->mapPort($portOnHost, $portOnContainer, 'udp')
    ->start();

环境变量

您可以使用setEnvironmentVariable方法设置环境变量。要添加多个参数,只需多次调用setEnvironmentVariable

$containerInstance = DockerContainer::create($imageName)
    ->setEnvironmentVariable($variableKey, $variableValue)
    ->setEnvironmentVariable($anotherVariableKey, $anotherVariableValue)
    ->start();

设置卷

您可以使用setVolume方法设置卷。要添加多个参数,只需多次调用setVolume

$containerInstance = DockerContainer::create($imageName)
    ->setVolume($pathOnHost, $pathOnDocker)
    ->setVolume($anotherPathOnHost, $anotherPathOnDocker)
    ->start();

设置标签

您可以使用setLabel方法设置标签。要添加多个参数,只需多次调用setLabel

$containerInstance = DockerContainer::create($imageName)
    ->setLabel($labelName, $labelValue)
    ->setLabel($anotherLabelName, $anotherLabelValue)
    ->start();

添加命令

您可以使用setCommands方法添加命令。

$containerInstance = DockerContainer::create($imageName)
    ->setCommands('--api.insecure=true', '--providers.docker=true')
    ->start();

这些命令将被放置在docker run命令的末尾。

添加可选参数

如果您想向docker run命令添加可选参数,请使用setOptionalArgs方法

$containerInstance = DockerContainer::create($imageName)
    ->setOptionalArgs('-it', '-a')
    ->start();

这些参数将被放置在docker run之后。

PHP结束后自动停止容器

在测试环境中使用此包时,当在它上调用 __destruct 后停止 docker 容器可能会有所帮助(这通常发生在 PHP 脚本结束时)。您可以通过 stopOnDestruct 方法启用此行为。

$containerInstance = DockerContainer::create($imageName)
    ->stopOnDestruct()
    ->start();

将网络附加到容器

如果您想将容器连接到 docker 网络,请使用 network 方法。

$containerInstance = DockerContainer::create($imageName)
    ->network('my-network')
    ->start();

指定执行时的远程 docker 主机

您可以设置用于执行容器的宿主机。`docker` 命令行接受一个守护进程套接字字符串。要通过 ssh 连接到远程 docker 主机,请使用语法 ssh://username@hostname。注意,您可能需要预先配置适当的 SSH 密钥来完成此操作。

$containerInstance = DockerContainer::create($imageName)
    ->remoteHost('ssh://username@hostname')
    ->start();

指定要执行的替代命令

在容器启动时,docker 将执行容器内部定义的命令。`command` 方法提供了覆盖容器内默认运行命令的能力。

$containerInstance = DockerContainer::create($imageName)
    ->command('ls -l /etc')
    ->start();

获取启动命令字符串

您可以使用 getStartCommand 函数获取启动容器时将执行的字符串。

// returns "docker run -d --rm spatie/docker"
DockerContainer::create($imageName)->getStartCommand();

更改启动命令超时时间

您可以使用 setStartCommandTimeout 函数更改启动命令的超时时间(默认为 60 秒)。

$containerInstance = DockerContainer::create($imageName)
    ->setStartCommandTimeout(120)
    ->start();

docker 容器实例上的可用方法

执行命令

要在容器上执行命令,请使用 execute 方法。

$process = $instance->execute($command);

您可以通过传递一个数组一次性执行多个命令。

$process = $instance->execute([$command, $anotherCommand]);

要更改进程超时,可以将第二个参数传递给 execute 方法(默认为 60 秒)。

$process = $instance->execute($command, 3600);

`execute` 方法返回一个 Symfony/Process 实例。

您可以使用 isSuccessful 方法检查您的命令是否成功运行。

$process->isSuccessful(); // returns a boolean

您可以使用 getOutput() 获取输出。如果命令没有成功运行,您可以使用 getErrorOutput()。有关如何使用 Process 的更多信息,请参阅 Symfony 文档

安装公钥

如果您想通过 SSH 连接到您的容器实例,您可能需要将其添加公钥。

这可以通过 addPublicKey 方法完成。

$instance->addPublicKey($pathToPublicKey);

假设 authorized_keys 文件位于 /root/.ssh/authorized_keys。如果情况不是这样,您可以将该文件的路径指定为第二个参数。

$instance->addPublicKey($pathToPublicKey, $pathToAuthorizedKeys);

请注意,为了能够通过 SSH 连接,您应该在 dockerfile 中设置 SSH 服务器。请参阅此包测试中的 dockerfile 以获取示例。

向您的实例添加文件

可以使用 addFiles 将文件添加到实例。

$instance->addFiles($fileOrDirectoryOnHost, $pathInContainer);

获取 docker inspect 信息

使用 inspect 可以检索 docker inspect 命令的解码 JSON 数组。

$inspectArray = $instance->inspect();
$inspectArray[0]['State']['Status']; // Running, Starting etc.
$inspectArray[0]['RestartCount']; // Integer
$inspectArray[0]['NetworkSettings']['IPAddress']; // 172.17.0.2

向 docker 实例添加其他函数

Spatie\Docker\ContainerInstance 类是 可宏化 的。这意味着您可以向其中添加额外的函数。

Spatie\Docker\DockerContainerInstance::macro('whoAmI', function () {
    $process = $containerInstance->run('whoami');


    return $process->getOutput();
});

$containerInstance = DockerContainer::create($imageName)->start();

$containerInstance->whoAmI(); // returns of name of user in the docker container

测试

在第一次运行测试之前,您必须使用以下命令构建 spatie/docker 容器:

composer build-docker

接下来,您可以使用以下命令运行测试:

composer test

变更日志

请参阅 变更日志 以获取有关最近更改的更多信息。

贡献

请参阅 贡献指南 以获取详细信息。

安全

如果您发现与安全相关的错误,请通过邮件发送到 security@spatie.be,而不是使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅 许可证文件