docker_image
The docker_image is responsible for managing Docker image pulls, builds, and deletions. It speaks directly to the Docker Engine API (opens in a new tab).
Actions
:pull- Pulls an image from the registry. Default action.:pull_if_missing- Pulls an image from the registry, only if it missing:build- Builds an image from a Dockerfile, directory, or tarball:build_if_missing- Same build, but only if it is missing:save- Exports an image to a tarball atdestination:import- Imports an image from a tarball atdestination:remove- Removes (untags) an image:push- Pushes an image to the registry
Properties
The docker_image resource properties mostly corresponds to the Docker Engine API (opens in a new tab) as driven by the docker-api Ruby gem (opens in a new tab)
A docker_image's full identifier is a string in the form <repo>:<tag>. There is some nuance around naming using the
public registry vs a private one.
repo- akaimage_name- The first half of a Docker image's identity. This is a string in the form:registry:port/owner/image_name. If theregistry:portportion is left off, Docker will implicitly use the Docker public registry. "Official Images" omit the owner part. This means a repo id can be as short asbusybox,alpine, orcentos. These names refer to official images on the public registry. Names can be as long asmy.computers.biz:5043/what/everto refer to custom images on an private registry. Often you'll see something likechef/chefto refer to private images on the public registry. - Defaults to resource name.tag- The second half of a Docker image's identity. - Defaults tolatestsource- Path to input for the:import,:buildand:build_if_missingactions. For building, this can be a Dockerfile, a tarball containing a Dockerfile in its root, or a directory containing a Dockerfile. For:import, this should be a tarball containing Docker formatted image, as generated with:save.destination- Path for output from the:saveaction.force- A force boolean used in various actions - Defaults to falsenocache- Used in:buildoperations. - Defaults to falsenoprune- Used in:removeoperations - Defaults to falserm- Remove intermediate containers after a successful build (default behavior) - Defaults totrueread_timeout- May need to increase for long image builds/pullswrite_timeout- May need to increase for long image builds/pullshost- A string containing the host the API should communicate with. Defaults toENV['DOCKER_HOST']if set.tls- Use TLS; implied by --tlsverify. Defaults to ENV['DOCKER_TLS'] if set.tls_verify- Use TLS and verify the remote. Defaults toENV['DOCKER_TLS_VERIFY']if settls_ca_cert- Trust certs signed only by this CA. Defaults toENV['DOCKER_CERT_PATH']if set.tls_client_cert- Path to TLS certificate file for docker cli. Defaults toENV['DOCKER_CERT_PATH']if settls_client_key- Path to TLS key file for docker cli. Defaults toENV['DOCKER_CERT_PATH']if set.buildargs- A String or Hash containing build arguments.
Examples
- default action, default properties
docker_image 'hello-world'- non-default name property
docker_image "Tom's container" do
repo 'tduffield/testcontainerd'
action :pull
end- pull every time
docker_image 'busybox' do
action :pull
end- specify a tag
docker_image 'alpine' do
tag '3.1'
end- specify read/write timeouts
docker_image 'alpine' do
read_timeout 60
write_timeout 60
enddocker_image 'vbatts/slackware' do
action :remove
end- save
docker_image 'save hello-world' do
repo 'hello-world'
destination '/tmp/hello-world.tar'
not_if { ::File.exist?('/tmp/hello-world.tar') }
action :save
end- build from a Dockerfile on every chef-client run
docker_image 'image_1' do
tag 'v0.1.0'
source '/src/myproject/container1/Dockerfile'
action :build
end- build from a directory, only if image is missing
docker_image 'image_2' do
tag 'v0.1.0'
source '/src/myproject/container2'
action :build_if_missing
end- build from a tarball NOTE: this is not an "export" tarball generated from an image save. The contents should be a Dockerfile, and anything it references to COPY or ADD
docker_image 'image_3' do
tag 'v0.1.0'
source '/tmp/image_3.tar'
action :build
enddocker_image 'hello-again' do
tag 'v0.1.0'
source '/tmp/hello-world.tar'
action :import
end- build from a Dockerfile on every chef-client run with
buildargs
Acceptable values for buildargs:
String:
buildargs '{"IMAGE_NAME":"alpine","IMAGE_TAG":"latest"}'
Hash:
buildargs "IMAGE_NAME": "alpine", "IMAGE_TAG": "latest"
buildargs "IMAGE_NAME" => "alpine", "IMAGE_TAG" => "latest"
docker_image 'image_1' do
source '/src/myproject/container1/Dockerfile'
buildargs '{"IMAGE_NAME":"alpine","IMAGE_TAG":"latest"}'
action :build
endWhere Dockerfile contains:
ARG IMAGE_TAG
ARG IMAGE_NAME
FROM $IMAGE_NAME:$IMAGE_TAG
ARG IMAGE_NAME
ENV image_name=$IMAGE_NAME
RUN echo $image_name > /image_name- push
docker_image 'my.computers.biz:5043/someara/hello-again' do
action :push
end- Connect to an external docker daemon and pull an image
docker_image 'alpine' do
host 'tcp://127.0.0.1:2376'
tag '2.7'
end