From cde46f0323305b79f0ed7b6d51f0a8f50c1b96c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Dugat?= Date: Mon, 9 Oct 2017 14:07:58 +0200 Subject: [PATCH] New Networks (+ aliases) management + Some fixes --- .../DockerContainer/NginxDockerContainer.php | 15 +++---- .../DockerContainer/Model/DockerContainer.php | 12 ++++-- .../Model/DockerContainerNetworksTrait.php | 39 ++++++++++++++++++- .../Model/DockerContainerPortsTrait.php | 16 ++++++++ .../DockerContainerDataTransformer.php | 7 +--- 5 files changed, 69 insertions(+), 20 deletions(-) diff --git a/src/Application/DockerContainer/NginxDockerContainer.php b/src/Application/DockerContainer/NginxDockerContainer.php index c1299b9..ebd5237 100644 --- a/src/Application/DockerContainer/NginxDockerContainer.php +++ b/src/Application/DockerContainer/NginxDockerContainer.php @@ -2,6 +2,7 @@ namespace Ph3\DockerArch\Application\DockerContainer; +use Cocur\Slugify\Slugify; use Ph3\DockerArch\Application\Architect; use Ph3\DockerArch\Domain\DockerContainer\Model\DockerContainer; use Ph3\DockerArch\Domain\DockerContainer\Model\DockerContainerInterface; @@ -63,14 +64,6 @@ public function execute(): void 'type' => 'rw', ]); - // Networks. - $this->addNetwork( - self::DOCKER_MAIN_NETWORK, - array_filter(array_keys($this->vhostsServicesByHost), function (string $host): bool { - return ('localhost' !== $host); - }) - ); - // Ports. $this->addEnvPort('NGINX', ['from' => '8080', 'to' => '80']); } @@ -113,15 +106,17 @@ private function addVhostsTemplatedFiles(): bool $vhostIndex = 0; foreach ($this->vhostsServicesByHost as $service) { $appType = $service->getOptions()['app_type'] ?? null; + preg_match('/(\w+)Service$/i', get_class($service), $matches); + $vhostFileName = (new Slugify())->slugify($matches[1], '-'); $templatePath = sprintf( 'Service/Nginx/vhosts/%s%s.conf.twig', - $service->getIdentifier(), + $vhostFileName, $appType ? '-'.$appType : null ); $filePath = sprintf( 'conf.d/%s-%s%s.vhost.conf', str_pad($vhostIndex + 10, 3, '0', STR_PAD_LEFT), - $service->getIdentifier(), + $vhostFileName, $appType ? '-'.$appType : null ); diff --git a/src/Domain/DockerContainer/Model/DockerContainer.php b/src/Domain/DockerContainer/Model/DockerContainer.php index 9df4651..76fe635 100644 --- a/src/Domain/DockerContainer/Model/DockerContainer.php +++ b/src/Domain/DockerContainer/Model/DockerContainer.php @@ -46,17 +46,18 @@ public function __construct(ServiceInterface $service) */ private function init(): void { + $service = $this->getService(); + $this ->setMaintainer('Docker Arch ') ->addEnv('DOCKER_CONTAINER_NAME', $this->getService()->getIdentifier()) - ->addEnv('DEBIAN_FRONTEND', 'noninteractive') - ->addNetwork(self::DOCKER_MAIN_NETWORK); + ->addEnv('DEBIAN_FRONTEND', 'noninteractive'); $this ->addPackage('openssh-client') ->addPackage('vim'); - if ($this->getService()->isWeb()) { + if ($service->isWeb()) { $this ->addEnv('TERM', 'xterm-256color') ->addEnv('GIT_DISCOVERY_ACROSS_FILESYSTEM', 'true') @@ -75,6 +76,11 @@ private function init(): void ->addCommand('update-ca-certificates'); } + $this->addNetwork(self::DOCKER_MAIN_NETWORK); + if (null !== $service->getHost() && 'localhost' !== $service->getHost()) { + $this->addNetworkAlias(self::DOCKER_MAIN_NETWORK, $service->getHost()); + } + $this->initLocale(); } diff --git a/src/Domain/DockerContainer/Model/DockerContainerNetworksTrait.php b/src/Domain/DockerContainer/Model/DockerContainerNetworksTrait.php index 97f4cde..81e6312 100644 --- a/src/Domain/DockerContainer/Model/DockerContainerNetworksTrait.php +++ b/src/Domain/DockerContainer/Model/DockerContainerNetworksTrait.php @@ -20,15 +20,50 @@ public function getNetworks(): array return $this->networks; } + /** + * @param string $name + * + * @return self + */ + public function addNetwork($name): self + { + if (false === array_key_exists($name, $this->networks)) { + $this->networks[$name] = []; + } + + return $this; + } + + /** + * @param string $name + * @param string $alias + * + * @return self + */ + public function addNetworkAlias($name, string $alias): self + { + if (false === array_key_exists($name, $this->networks)) { + $this->addNetwork($name); + } + + if (false === in_array($alias, $this->networks[$name])) { + $this->networks[$name][] = $alias; + } + + return $this; + } + /** * @param string $name * @param array $aliases * * @return self */ - public function addNetwork($name, array $aliases = []): self + public function addNetworkAliases($name, array $aliases = []): self { - $this->networks[$name] = $aliases; + foreach ($aliases as $alias) { + $this->addNetworkAlias($name, $alias); + } return $this; } diff --git a/src/Domain/DockerContainer/Model/DockerContainerPortsTrait.php b/src/Domain/DockerContainer/Model/DockerContainerPortsTrait.php index ed67505..ea40cfe 100644 --- a/src/Domain/DockerContainer/Model/DockerContainerPortsTrait.php +++ b/src/Domain/DockerContainer/Model/DockerContainerPortsTrait.php @@ -32,6 +32,22 @@ public function addPort(array $port): self return $this; } + /** + * @param string $port + * + * @return self + */ + public function addPortFromString(string $port): self + { + $port = explode(':', $port); + $this->addPort([ + 'from' => $port[0], + 'to' => $port[1], + ]); + + return $this; + } + /** * @param array $ports * diff --git a/src/Infrastructure/Common/Persistence/DataTransformer/DockerContainerDataTransformer.php b/src/Infrastructure/Common/Persistence/DataTransformer/DockerContainerDataTransformer.php index d53233a..e97dd45 100644 --- a/src/Infrastructure/Common/Persistence/DataTransformer/DockerContainerDataTransformer.php +++ b/src/Infrastructure/Common/Persistence/DataTransformer/DockerContainerDataTransformer.php @@ -29,11 +29,8 @@ public function updateModel(DockerContainerInterface $dockerContainer, array $da if ($data['working_dir'] ?? null) { $dockerContainer->setWorkingDir($data['working_dir']); } - foreach ($data['ports'] ?? [] as $from => $to) { - $dockerContainer->addPort([ - 'from' => $from, - 'to' => $to, - ]); + foreach ($data['ports'] ?? [] as $port) { + $dockerContainer->addPortFromString($port); } foreach ($data['envs'] ?? [] as $key => $value) { $dockerContainer->addEnv($key, $value);