# docker **Repository Path**: mirrors_spatie/docker ## Basic Information - **Project Name**: docker - **Description**: Manage docker containers with PHP - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-06 - **Last Updated**: 2026-02-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Manage docker containers with PHP [![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/docker.svg?style=flat-square)](https://packagist.org/packages/spatie/docker) [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/spatie/docker/run-tests.yml?label=tests)](https://github.com/spatie/docker/actions?query=workflow%3Arun-tests+branch%3Amaster) [![Total Downloads](https://img.shields.io/packagist/dt/spatie/docker.svg?style=flat-square)](https://packagist.org/packages/spatie/docker) This package provides a nice way to start docker containers and execute commands on them. ````php $containerInstance = DockerContainer::create($imageName)->start(); $process = $containerInstance->execute('whoami'); $process->getOutput(); // returns the name of the user inside the docker container ```` ## Support us [](https://spatie.be/github-ad-click/docker) We invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us). We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards). ## Installation You can install the package via composer: ```bash composer require spatie/docker ``` ## Usage You can get an instance of a docker container using ```php $containerInstance = DockerContainer::create($imageName)->start(); ``` By default the container will be daemonized and it will be cleaned up after it exists. ### Customizing the docker container #### Prevent daemonization If you don't want your docker being daemonized, call `doNotDaemonize`. ```php $containerInstance = DockerContainer::create($imageName) ->doNotDaemonize() ->start(); ``` #### Prevent automatic clean up If you don't want your docker being cleaned up after it exists, call `doNotCleanUpAfterExit`. ```php $containerInstance = DockerContainer::create($imageName) ->doNotCleanUpAfterExit() ->start(); ``` #### Priviliged If you want your docker being privileged, call `privileged`. ```php $containerInstance = DockerContainer::create($imageName) ->privileged() ->start(); ``` #### Custom shell If the `bash` shell is not available in your docker image, you can specify an alternative shell. ```php $containerInstance = DockerContainer::create($imageName) ->shell('sh') ->start(); ``` #### Custom docker binary If the `docker` binary is not globally available, you can specify the exact path. ```php $containerInstance = DockerContainer::create($imageName) ->dockerBin('/usr/local/bin/docker') ->start(); ``` #### Naming the container You can name the container by passing the name as the second argument to the constructor. ```php new DockerContainer($imageName, $nameOfContainer); ``` Alternatively, use the `name` method. ```php $containerInstance = DockerContainer::create($imageName) ->name($yourName) ->start(); ``` #### Mapping ports You can map ports between the host machine and the docker container using the `mapPort` method. To map multiple ports, just call `mapPort` multiple times. ```php $containerInstance = DockerContainer::create($imageName) ->mapPort($portOnHost, $portOnContainer) ->mapPort($anotherPortOnHost, $anotherPortOnContainer) ->start(); ``` The default protocol for the port mapping is TCP. If you want to use UDP, you can pass it as the third argument. ```php $containerInstance = DockerContainer::create($imageName) ->mapPort($portOnHost, $portOnContainer, 'udp') ->start(); ``` #### Environment variables You can set environment variables using the `setEnvironmentVariable` method. To add multiple arguments, just call `setEnvironmentVariable` multiple times. ```php $containerInstance = DockerContainer::create($imageName) ->setEnvironmentVariable($variableKey, $variableValue) ->setEnvironmentVariable($anotherVariableKey, $anotherVariableValue) ->start(); ``` #### Setting Volumes You can set volumes using the `setVolume` method. To add multiple arguments, just call `setVolume` multiple times. ```php $containerInstance = DockerContainer::create($imageName) ->setVolume($pathOnHost, $pathOnDocker) ->setVolume($anotherPathOnHost, $anotherPathOnDocker) ->start(); ``` #### Setting Labels You can set labels using the `setLabel` method. To add multiple arguments, just call `setLabel` multiple times. ```php $containerInstance = DockerContainer::create($imageName) ->setLabel($labelName, $labelValue) ->setLabel($anotherLabelName, $anotherLabelValue) ->start(); ``` #### Adding Commands You can add commands using the `setCommands` method. ```php $containerInstance = DockerContainer::create($imageName) ->setCommands('--api.insecure=true', '--providers.docker=true') ->start(); ``` These commands will be placed at the end of to the `docker run` command. #### Add optional arguments If you want to add optional arguments to the `docker run` command, use `setOptionalArgs` method: ```php $containerInstance = DockerContainer::create($imageName) ->setOptionalArgs('-it', '-a') ->start(); ``` These arguments will be placed after `docker run` immediately. #### Automatically stopping the container after PHP exists When using this package in a testing environment, it can be handy that the docker container is stopped after `__destruct` is called on it (mostly this will happen when the PHP script ends). You can enable this behaviour with the `stopOnDestruct` method. ```php $containerInstance = DockerContainer::create($imageName) ->stopOnDestruct() ->start(); ``` #### Attaching a network to the container If you want to attach the container to a docker network, use `network` method: ```php $containerInstance = DockerContainer::create($imageName) ->network('my-network') ->start(); ``` #### Specify a remote docker host for execution You can set the host used for executing the container. The `docker` command line accepts a daemon socket string. To connect to a remote docker host via ssh, use the syntax `ssh://username@hostname`. Note that the proper SSH keys will already need to be configured for this work. ```php $containerInstance = DockerContainer::create($imageName) ->remoteHost('ssh://username@hostname') ->start(); ``` #### Specify an alternative command to execute Upon startup of a container, docker will execute the command defined within the container. The `command` method gives the ability to override to default command to run within the container. ```php $containerInstance = DockerContainer::create($imageName) ->command('ls -l /etc') ->start(); ``` #### Getting the start command string You can get the string that will be executed when a container is started with the `getStartCommand` function ```php // returns "docker run -d --rm spatie/docker" DockerContainer::create($imageName)->getStartCommand(); ``` #### Changing the start command timeout You can change the timeout for the start command with the `setStartCommandTimeout` function _(the default is 60s)_. ```php $containerInstance = DockerContainer::create($imageName) ->setStartCommandTimeout(120) ->start(); ``` ### Available methods on the docker container instance #### Executing a command To execute a command on the container, use the `execute` method. ```php $process = $instance->execute($command); ``` You can execute multiple command in one go by passing an array. ```php $process = $instance->execute([$command, $anotherCommand]); ``` To change the process timeout you can pass a second parameter to the `execute` method _(the default is 60s)_. ```php $process = $instance->execute($command, 3600); ``` The execute method returns an instance of [`Symfony/Process`](https://symfony.com/doc/current/components/process.html). You can check if your command ran successfully using the `isSuccessful` $method ```php $process->isSuccessful(); // returns a boolean ``` You can get to the output using `getOutput()`. If the command did not run successfully, you can use `getErrorOutput()`. For more information on how to work with a `Process` head over to [the Symfony docs](https://symfony.com/doc/current/components/process.html). #### Installing a public key If you cant to connect to your container instance via SSH, you probably want to add a public key to it. This can be done using the `addPublicKey` method. ```php $instance->addPublicKey($pathToPublicKey); ``` It is assumed that the `authorized_keys` file is located in at `/root/.ssh/authorized_keys`. If this is not the case, you can specify the path of that file as a second parameter. ```php $instance->addPublicKey($pathToPublicKey, $pathToAuthorizedKeys); ``` Note that in order to be able to connect via SSH, you should set up a SSH server in your `dockerfile`. Take a look at the `dockerfile` in the tests of this package for an example. #### Adding files to your instance Files can be added to an instance with `addFiles`. ```php $instance->addFiles($fileOrDirectoryOnHost, $pathInContainer); ``` #### Get the docker inspect information The json decoded array from the docker inspect command can be retrieved with `inspect`. ```php $inspectArray = $instance->inspect(); $inspectArray[0]['State']['Status']; // Running, Starting etc. $inspectArray[0]['RestartCount']; // Integer $inspectArray[0]['NetworkSettings']['IPAddress']; // 172.17.0.2 ``` #### Adding other functions on the docker instance The `Spatie\Docker\ContainerInstance` class is [macroable](https://github.com/spatie/macroable). This means you can add extra functions to it. ````php 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 ```` ### Testing Before running the tests for the first time, you must build the `spatie/docker` container with: ````bash composer build-docker ```` Next, you can run the tests with: ``` bash composer test ``` ## Changelog Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. ## Contributing Please see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details. ## Security If you've found a bug regarding security please mail [security@spatie.be](mailto:security@spatie.be) instead of using the issue tracker. ## Credits - [Ruben Van Assche](https://github.com/rubenvanassche) - [Freek Van der Herten](https://github.com/freekmurze) - [All Contributors](../../contributors) ## License The MIT License (MIT). Please see [License File](LICENSE.md) for more information.