Skip to content

Commit 6a566e1

Browse files
authored
Merge pull request #975 from nathanlcarlson/update_compose
Use the docker-compose-plugin via 'docker compose' instead of 'docker-compose'
2 parents 715743d + e7bce6a commit 6a566e1

File tree

8 files changed

+76
-335
lines changed

8 files changed

+76
-335
lines changed

lib/puppet/provider/docker_compose/ruby.rb

+14-16
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
has_command(:docker, 'docker')
1111

12-
has_command(:dockercompose, 'docker-compose')
13-
1412
def set_tmpdir
1513
return unless resource[:tmpdir]
1614

@@ -28,8 +26,8 @@ def exists?
2826
set_tmpdir
2927

3028
# get merged config using docker-compose config
31-
args = [compose_files, '-p', name, 'config'].insert(3, resource[:options]).compact
32-
compose_output = Puppet::Util::Yaml.safe_load(execute([command(:dockercompose)] + args, combine: false), [Symbol])
29+
args = ['compose', compose_files, '-p', name, 'config'].insert(3, resource[:options]).compact
30+
compose_output = Puppet::Util::Yaml.safe_load(execute([command(:docker)] + args, combine: false), [Symbol])
3331

3432
containers = docker([
3533
'ps',
@@ -76,32 +74,32 @@ def get_image(service_name, compose_services)
7674

7775
def create
7876
Puppet.info("Running compose project #{name}")
79-
args = [compose_files, '-p', name, 'up', '-d', '--remove-orphans'].insert(3, resource[:options]).insert(5, resource[:up_args]).compact
80-
dockercompose(args)
77+
args = ['compose', compose_files, '-p', name, 'up', '-d', '--remove-orphans'].insert(3, resource[:options]).insert(5, resource[:up_args]).compact
78+
docker(args)
8179
return unless resource[:scale]
8280

8381
instructions = resource[:scale].map { |k, v| "#{k}=#{v}" }
8482
Puppet.info("Scaling compose project #{name}: #{instructions.join(' ')}")
85-
args = [compose_files, '-p', name, 'scale'].insert(3, resource[:options]).compact + instructions
86-
dockercompose(args)
83+
args = ['compose', compose_files, '-p', name, 'scale'].insert(3, resource[:options]).compact + instructions
84+
docker(args)
8785
end
8886

8987
def destroy
9088
Puppet.info("Removing all containers for compose project #{name}")
91-
kill_args = [compose_files, '-p', name, 'kill'].insert(3, resource[:options]).compact
92-
dockercompose(kill_args)
93-
rm_args = [compose_files, '-p', name, 'rm', '--force', '-v'].insert(3, resource[:options]).compact
94-
dockercompose(rm_args)
89+
kill_args = ['compose', compose_files, '-p', name, 'kill'].insert(3, resource[:options]).compact
90+
docker(kill_args)
91+
rm_args = ['compose', compose_files, '-p', name, 'rm', '--force', '-v'].insert(3, resource[:options]).compact
92+
docker(rm_args)
9593
end
9694

9795
def restart
9896
return unless exists?
9997

10098
Puppet.info("Rebuilding and Restarting all containers for compose project #{name}")
101-
kill_args = [compose_files, '-p', name, 'kill'].insert(3, resource[:options]).compact
102-
dockercompose(kill_args)
103-
build_args = [compose_files, '-p', name, 'build'].insert(3, resource[:options]).compact
104-
dockercompose(build_args)
99+
kill_args = ['compose', compose_files, '-p', name, 'kill'].insert(3, resource[:options]).compact
100+
docker(kill_args)
101+
build_args = ['compose', compose_files, '-p', name, 'build'].insert(3, resource[:options]).compact
102+
docker(build_args)
105103
create
106104
end
107105

manifests/compose.pp

+30-100
Original file line numberDiff line numberDiff line change
@@ -7,118 +7,48 @@
77
# @param version
88
# The version of Docker Compose to install.
99
#
10-
# @param install_path
11-
# The path where to install Docker Compose.
12-
#
13-
# @param symlink_name
14-
# The name of the symlink created pointing to the actual docker-compose binary
15-
# This allows use of own docker-compose wrapper scripts for the times it's
16-
# necessary to set certain things before running the docker-compose binary
17-
#
18-
# @param proxy
19-
# Proxy to use for downloading Docker Compose.
20-
#
21-
# @param base_url
22-
# The base url for installation
23-
# This allows use of a mirror that follows the same layout as the
24-
# official repository
25-
#
26-
# @param raw_url
27-
# Override the raw URL for installation
28-
# The default is to build a URL from baseurl. If rawurl is set, the caller is
29-
# responsible for ensuring the URL points to the correct version and
30-
# architecture.
31-
#
32-
# @param curl_ensure
33-
# Whether or not the curl package is ensured by this module.
34-
#
3510
class docker::compose (
36-
Enum[present,absent] $ensure = present,
37-
Optional[String] $version = $docker::params::compose_version,
38-
Optional[String] $install_path = $docker::params::compose_install_path,
39-
Optional[String] $symlink_name = $docker::params::compose_symlink_name,
40-
Optional[Pattern['^((http[s]?)?:\/\/)?([^:^@]+:[^:^@]+@|)([\da-z\.-]+)\.([\da-z\.]{2,6})(:[\d])?([\/\w \.-]*)*\/?$']] $proxy = undef,
41-
Optional[String] $base_url = $docker::params::compose_base_url,
42-
Optional[String] $raw_url = undef,
43-
Optional[Boolean] $curl_ensure = $docker::params::curl_ensure,
44-
) inherits docker::params {
45-
if $facts['os']['family'] == 'windows' {
46-
$file_extension = '.exe'
47-
$file_owner = 'Administrator'
48-
} else {
49-
$file_extension = ''
50-
$file_owner = 'root'
51-
}
11+
Enum[present,absent] $ensure = present,
12+
Optional[String] $version = undef,
13+
) {
14+
include docker
5215

53-
$docker_compose_location = "${install_path}/${symlink_name}${file_extension}"
54-
$docker_compose_location_versioned = "${install_path}/docker-compose-${version}${file_extension}"
16+
if $docker::manage_package {
17+
include docker::params
5518

56-
if $ensure == 'present' {
57-
if $raw_url != undef {
58-
$docker_compose_url = $raw_url
59-
} else {
60-
$docker_compose_url = "${base_url}/${version}/docker-compose-${facts['kernel']}-${facts['os']['hardware']}${file_extension}"
19+
$_version = $version ? {
20+
undef => $docker::params::compose_version,
21+
default => $version,
6122
}
62-
63-
if $proxy != undef {
64-
$proxy_opt = "--proxy ${proxy}"
23+
if $_version and $ensure != 'absent' {
24+
$package_ensure = $_version
6525
} else {
66-
$proxy_opt = ''
26+
$package_ensure = $ensure
6727
}
6828

69-
if $facts['os']['family'] == 'windows' {
70-
$docker_download_command = "if (Invoke-WebRequest ${docker_compose_url} ${proxy_opt} -UseBasicParsing -OutFile \"${docker_compose_location_versioned}\") { exit 0 } else { exit 1}" # lint:ignore:140chars
71-
72-
$parameters = {
73-
'proxy' => $proxy,
74-
'docker_compose_url' => $docker_compose_url,
75-
'docker_compose_location_versioned' => $docker_compose_location_versioned,
29+
case $facts['os']['family'] {
30+
'Debian': {
31+
$_require = $docker::use_upstream_package_source ? {
32+
true => [Apt::Source['docker'], Class['apt::update']],
33+
false => undef,
34+
}
7635
}
77-
78-
exec { "Install Docker Compose ${version}":
79-
command => epp('docker/windows/download_docker_compose.ps1.epp', $parameters),
80-
provider => powershell,
81-
creates => $docker_compose_location_versioned,
36+
'RedHat': {
37+
$_require = $docker::use_upstream_package_source ? {
38+
true => Yumrepo['docker'],
39+
false => undef,
40+
}
8241
}
83-
84-
file { $docker_compose_location:
85-
ensure => 'link',
86-
target => $docker_compose_location_versioned,
87-
require => Exec["Install Docker Compose ${version}"],
88-
}
89-
} else {
90-
if $curl_ensure {
91-
stdlib::ensure_packages(['curl'])
92-
}
93-
94-
exec { "Install Docker Compose ${version}":
95-
path => '/usr/bin/',
96-
cwd => '/tmp',
97-
command => "curl -s -S -L ${proxy_opt} ${docker_compose_url} -o ${docker_compose_location_versioned}",
98-
creates => $docker_compose_location_versioned,
99-
require => Package['curl'],
42+
'Windows': {
43+
fail('The docker compose portion of this module is not supported on Windows')
10044
}
101-
102-
file { $docker_compose_location_versioned:
103-
owner => $file_owner,
104-
mode => '0755',
105-
seltype => 'container_runtime_exec_t',
106-
require => Exec["Install Docker Compose ${version}"],
107-
}
108-
109-
file { $docker_compose_location:
110-
ensure => 'link',
111-
target => $docker_compose_location_versioned,
112-
require => File[$docker_compose_location_versioned],
45+
default: {
46+
fail('The docker compose portion of this module only works on Debian or RedHat')
11347
}
11448
}
115-
} else {
116-
file { $docker_compose_location_versioned:
117-
ensure => absent,
118-
}
119-
120-
file { $docker_compose_location:
121-
ensure => absent,
49+
package { 'docker-compose-plugin':
50+
ensure => $package_ensure,
51+
require => $_require,
12252
}
12353
}
12454
}

manifests/params.pp

+1-6
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@
4747
$dns = undef
4848
$dns_search = undef
4949
$proxy = undef
50-
$compose_base_url = 'https://github.com/docker/compose/releases/download'
51-
$compose_symlink_name = 'docker-compose'
50+
$compose_version = undef
5251
$no_proxy = undef
5352
$execdriver = undef
5453
$storage_driver = undef
@@ -90,16 +89,12 @@
9089
$docker_command = 'docker'
9190

9291
if ($facts['os']['family'] == 'windows') {
93-
$compose_install_path = "${facts['docker_program_files_path']}/Docker"
94-
$compose_version = '1.29.2'
9592
$docker_ee_package_name = 'Docker'
9693
$machine_install_path = "${facts['docker_program_files_path']}/Docker"
9794
$tls_cacert = "${facts['docker_program_data_path']}/docker/certs.d/ca.pem"
9895
$tls_cert = "${facts['docker_program_data_path']}/docker/certs.d/server-cert.pem"
9996
$tls_key = "${facts['docker_program_data_path']}/docker/certs.d/server-key.pem"
10097
} else {
101-
$compose_install_path = '/usr/local/bin'
102-
$compose_version = '1.29.2'
10398
$docker_ee_package_name = 'docker-ee'
10499
$machine_install_path = '/usr/local/bin'
105100
$tls_cacert = '/etc/docker/tls/ca.pem'

spec/acceptance/compose_v3_spec.rb

+18-46
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,21 @@
22

33
require 'spec_helper_acceptance'
44

5-
if os[:family] == 'windows'
6-
install_dir = '/cygdrive/c/Program Files/Docker'
7-
file_extension = '.exe'
8-
docker_args = 'docker_ee => true'
9-
tmp_path = 'C:/cygwin64/tmp'
10-
test_container = if %r{2019|2022}.match?(os[:release])
11-
'nanoserver'
12-
else
13-
'nanoserver-sac2016'
14-
end
15-
else
16-
docker_args = ''
17-
install_dir = '/usr/local/bin'
18-
file_extension = ''
19-
tmp_path = '/tmp'
20-
test_container = 'debian'
21-
end
5+
tmp_path = '/tmp'
6+
test_container = 'debian'
227

23-
describe 'docker compose' do
8+
describe 'docker compose', :win_broken do
249
before(:all) do
2510
retry_on_error_matching(60, 5, %r{connection failure running}) do
2611
install_code = <<-CODE
27-
class { 'docker': #{docker_args} }
28-
class { 'docker::compose':
29-
version => '1.23.2',
30-
}
12+
class { 'docker': }
13+
class { 'docker::compose': }
3114
CODE
3215
apply_manifest(install_code, catch_failures: true)
3316
end
3417
end
3518

36-
context 'Creating compose v3 projects', :win_broken do
19+
context 'Creating compose v3 projects' do
3720
let(:install_pp) do
3821
<<-MANIFEST
3922
docker_compose { 'web':
@@ -51,15 +34,15 @@ class { 'docker::compose':
5134
end
5235

5336
it 'has docker compose installed' do
54-
run_shell('docker-compose --help', expect_failures: false)
37+
run_shell('docker compose --help', expect_failures: false)
5538
end
5639

5740
it 'finds a docker container' do
58-
run_shell('docker inspect web_compose_test_1', expect_failures: false)
41+
run_shell('docker inspect web-compose_test_1', expect_failures: false)
5942
end
6043
end
6144

62-
context 'creating compose projects with multi compose files', :win_broken do
45+
context 'creating compose projects with multi compose files' do
6346
before(:all) do
6447
install_pp = <<-MANIFEST
6548
docker_compose { 'web1':
@@ -75,11 +58,11 @@ class { 'docker::compose':
7558
end
7659

7760
it "finds container with #{test_container} tag" do
78-
run_shell("docker inspect web1_compose_test_1 | grep #{test_container}", acceptable_exit_codes: [0])
61+
run_shell("docker inspect web1-compose_test_1 | grep #{test_container}", acceptable_exit_codes: [0])
7962
end
8063
end
8164

82-
context 'Destroying project with multiple compose files', :win_broken do
65+
context 'Destroying project with multiple compose files' do
8366
let(:destroy_pp) do
8467
<<-MANIFEST
8568
docker_compose { 'web1':
@@ -105,31 +88,26 @@ class { 'docker::compose':
10588
end
10689

10790
it 'does not find a docker container' do
108-
run_shell('docker inspect web1_compose_test_1', expect_failures: true)
91+
run_shell('docker inspect web1-compose_test_1', expect_failures: true)
10992
end
11093
end
11194

11295
context 'Requesting a specific version of compose' do
11396
let(:version) do
114-
'1.21.2'
97+
'2.25.0'
11598
end
11699

117100
it 'is idempotent' do
118101
pp = <<-MANIFEST
119102
class { 'docker::compose':
120-
version => '#{version}',
103+
version => '#{version}-*',
121104
}
122105
MANIFEST
123106
idempotent_apply(pp)
124107
end
125108

126109
it 'has installed the requested version' do
127-
if os[:family] == 'redhat' && os[:release].to_i == 7
128-
run_shell('sudo mv /usr/local/bin/docker-compose /usr/bin/docker-compose')
129-
run_shell('sudo chmod +x /usr/bin/docker-compose')
130-
end
131-
command = 'docker-compose --version'
132-
command = "export PATH=/usr/local/bin:$PATH && #{command}" if os[:family] == 'redhat'
110+
command = 'docker compose version'
133111

134112
run_shell(command, expect_failures: false) do |r|
135113
expect(r.stdout).to match(%r{#{version}})
@@ -138,13 +116,9 @@ class { 'docker::compose':
138116
end
139117

140118
context 'Removing docker compose' do
141-
let(:version) do
142-
'1.21.2'
143-
end
144-
145119
after(:all) do
146120
install_pp = <<-MANIFEST
147-
class { 'docker': #{docker_args}}
121+
class { 'docker': }
148122
class { 'docker::compose': }
149123
MANIFEST
150124
apply_manifest(install_pp, catch_failures: true)
@@ -154,15 +128,13 @@ class { 'docker::compose': }
154128
pp = <<-MANIFEST
155129
class { 'docker::compose':
156130
ensure => absent,
157-
version => '#{version}',
158131
}
159132
MANIFEST
160133
idempotent_apply(pp)
161134
end
162135

163-
it 'has removed the relevant files' do
164-
run_shell("test -e \"#{install_dir}/docker-compose#{file_extension}\"", expect_failures: true)
165-
run_shell("test -e \"#{install_dir}/docker-compose-#{version}#{file_extension}\"", expect_failures: true)
136+
it 'has removed the compose plugin' do
137+
run_shell('docker compose version', expect_failures: true)
166138
end
167139
end
168140
end

0 commit comments

Comments
 (0)