alvar01o/docker

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

1.6.3 2021-01-26 17:34 UTC

This package is auto-updated.

Last update: 2024-09-27 02:21:30 UTC


README

此包是从spatie/docker分支出来的,提供了一种启动docker容器、docker-compose命令的便捷方式。

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

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

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

安装

您可以通过composer安装此包

composer require alvar01o/docker

用法

您可以使用以下方式获取docker容器实例

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

默认情况下,容器将作为守护进程运行,并在容器存在后进行清理。

您可以使用以下方式获取docker compose命令

$dockerComposeDirectory = './scripts/laravel-commands';
$dockerCompose = new DockerCompose($dockerComposeDirectory);
$dockerCompose->up();
$dockerCompose->start();

自定义docker容器

防止守护进程化

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

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

防止自动清理

如果您不希望容器存在后自动清理docker,请调用doNotCleanUpAfterExit

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

特权

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

$containerInstance = DockerContainer::create($imageName)
    ->privileged()
    ->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();

环境变量

您可以使用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();

PHP存在后自动停止容器

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

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

获取启动命令字符串

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

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

docker容器实例上的可用方法

执行命令

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

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

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

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

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实例中添加其他功能

Spatie\Docker\ContainerInstance类是可宏扩展的。这意味着您可以向其中添加额外功能。

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


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

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

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

测试

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

composer build-docker

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

composer test

变更日志

有关最近更改的详细信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全性

如果您发现任何安全相关的问题,请通过电子邮件freek@spatie.be与我们联系,而不是使用问题跟踪器。

鸣谢

许可证

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