Building an Image
In order to build an image you need to provide the $inputStream variable which correspond to the tar binary of a
folder containing a Dockerfile (or another name by using the dockerfile parameters) and other files used during the
build.
Since Docker build directory can be heavy, Docker PHP override this call and allows passing a resource or a
Psr\Http\Message\StreamInterface instance (string is also possible but not recommended).
This avoid using too much memory in PHP.
Build return
This function can return 3 different objects depending on the value of the $fetch parameter:
Docker::FETCH_OBJECT
This is default mode, where this function will block until the build is finished and return an array of BuildInfo
object.
This object contains the log of the build:
<?php
use Docker\Docker;
$inputStream = create_tar_stream_resource();
$docker = Docker::create();
$buildStream = $docker->imageBuild($inputStream);
$buildStream->onFrame(function (BuildInfo $buildInfo) {
echo $buildInfo->getStream();
});
$buildStream->wait();
Docker::FETCH_RESPONSE
The build function will return the raw PSR7 Response. It's up too you handle decoding and receiving correct output in this case.
Context
Docker PHP provides a ContextInterface and a default Context object for creating the $inputStream of the build
method.
<?php
use Docker\Context\Context;
use Docker\Docker;
$context = new Context('/path/to/my/docker/build');
$inputStream = $context->toStream();
$docker = Docker::create();
$docker->imageBuild($inputStream);
You can safely use this context object to build image with a huge directory to size without consuming any memory or disk
on the PHP side as it will directly pipe the output of a tar process into the Docker Remote API.
Context Builder
Additionally you can use the ContextBuilder to have a dynamic generation of your Dockerfile:
<?php
use Docker\Context\ContextBuilder;
use Docker\Docker;
$contextBuilder = new ContextBuilder();
$contextBuilder->from('ubuntu:latest');
$contextBuilder->run('apt-get update && apt-get install -y php5');
$docker = Docker::create();
$docker->imageBuild($contextBuilder->getContext()->toStream());