spatie / docker
在您的PHPUnit测试中运行docker容器
Requires
- php: ^7.4|^8.0
- spatie/macroable: ^1.0|^2.0
- symfony/process: ^5.3|^6.0|^7.0
Requires (Dev)
- pestphp/pest: ^1.22
- phpunit/phpunit: ^9.4
- spatie/ssh: ^1.7.0
- symfony/var-dumper: ^5.3
README
此包提供了一种启动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)。有关更多信息,请参阅 许可证文件。