alvar01o / docker
在您的PHPUnit测试中运行docker容器
Requires
- php: ^7.4 || ^8.0
- spatie/macroable: ^1.0
- symfony/process: ^4.0|^5.0
Requires (Dev)
- laravel/homestead: ^7
- laravel/installer: ^1.3 !=1.3.2
- phpunit/phpunit: ^8.2 || ^9.0
- spatie/ssh: dev-master
- symfony/var-dumper: ^4.3
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)。有关更多信息,请参阅许可证文件。