puppetlabs / puppetlabs/puppetlabs-docker

Using Compose with build statement a container is not detected as running and recreated with each run

Open Beginner friendly
#955 11 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Ruby
Stars
94
Forks
337
Avg merge
11d 15h
Merged PRs (30d)
2

Description

Describe the Bug

Using docker_compose together with a docker-compose.yaml with a custom build image like for example:

  • docker-compose.yml:
version: '3.5'

services:
  example:
    build:
      context: .
      dockerfile: Dockerfile
  • Dockerfile:
FROM alpine:3.14
CMD /bin/sh
  • docker_example.pp:
class docker_example {

file { [
    "/srv/docker-configs",
    "/srv/docker-configs/example"]:
    ensure => directory,
    group  => 'root',
    owner  => 'root'
}

file { '/srv/docker-configs/example/Dockerfile':
    mode    => '644',
    source  => 'example/Dockerfile',
    require => File["/srv/docker-configs/example"]
}

exec {"docker-compose build":
    cwd => "/srv/docker-configs/example",
    path => "/usr/local/bin", # for updated docker-compose
    refreshonly => true,
    subscribe => [
      File["/srv/docker-configs/example/Dockerfile"],
    ],
    notify => Docker_compose["example"]
  }

  docker_compose { "example":
     compose_file => ["/srv/docker-configs/example/docker-compose.yml"],
     ensure => present,
     require => File["/srv/docker-configs/example/docker-compose.yml"],
  }
}

And having docker-compose >= 2.8.0 installed, one can observe the following issue.

Puppet does not detect the docker-container as already running and tries to recreates it with every puppet run.
The following message can be observed in the logs of puppet with each run

puppet-agent: (/Stage[main]/Docker_example/Dockercompose[example]/Docker_compose[example]/ensure) created (corrective)

Expected Behavior

The container is not attempted to be created as a corrective measure with each puppet agent run when it is already running.

Steps to Reproduce

Steps to reproduce the behavior:

  1. using the above setup
  2. run puppet agent -t

Environment

  • Puppet Server Version 5.5.22
  • Module Version Version 3.10.2, also tried more recent versions.
  • Platform Ubuntu 22.04
  • Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1
  • Docker Compose version v2.18.0

Additional Context

During further analysis I was able to track the issue down to following changes:

  • The separator for images built by docker-compose has been changed from _ to - with this commit: Docker compose
  • The Migrate to Compose V2 guide also states that this has been changed due to _ not being a valid character for DNS-names.
  • From July 2023 Compose V1 stopped receiving updates. It’s also no longer available in new releases of Docker Desktop.

Workaround:

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by inspecting lib/puppet/provider/docker_compose/ruby.rb around line 71, where the issue identifies the image-name separator. Reproduce the setup with Docker Compose v2, then verify that an already-running container is not recreated on a subsequent puppet agent run and that the provider remains compatible with the reported workaround.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, docker-compose, ruby
Domain
devops, infrastructure
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
66/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.