Skip to content

Commit d811930

Browse files
authored
Merge pull request #673 from ixopay/main
Ensure image digest checksum before starting
2 parents c741a9c + 04ed40c commit d811930

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

manifests/run.pp

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020
# This will allow the docker container to be restarted if it dies, without
2121
# puppet help.
2222
#
23+
# @param verify_digest
24+
# (optional) Make sure, that the image has not modified. Compares the digest
25+
# checksum before starting the docker image.
26+
# To get the digest of an image, run the following command:
27+
# docker image inspect <<image>> --format='{{index .RepoDigests 0}}
28+
#
2329
# @param service_prefix
2430
# (optional) The name to prefix the startup script with and the Puppet
2531
# service resource title with. Default: 'docker-'
@@ -186,6 +192,7 @@
186192
define docker::run(
187193
Optional[Pattern[/^[\S]*$/]] $image,
188194
Optional[Enum[present,absent]] $ensure = 'present',
195+
Optional[String] $verify_digest = undef,
189196
Optional[String] $command = undef,
190197
Optional[Pattern[/^[\d]*(b|k|m|g)$/]] $memory_limit = '0b',
191198
Variant[String,Array,Undef] $cpuset = [],

spec/acceptance/docker_full_spec.rb

+31
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'nanoserver-sac2016'
1010
end
1111
default_digest = 'sha256:dcba85354678b50608b8c40ec6d17cce063a224aa0e12b6a55dc47b67f039e75'
12+
default_local_digest = 'sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10'
1213
second_image = 'winamd64/hola-mundo'
1314
default_dockerfile = 'C:/Users/Administrator/AppData/Local/Temp/Dockerfile'
1415
dockerfile_test = 'C:/Windows/Dockerfile_test.txt'
@@ -34,6 +35,7 @@
3435
second_image = 'busybox'
3536
default_image_tag = '3.7'
3637
default_digest = 'sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a'
38+
default_local_digest = 'sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10'
3739
default_dockerfile = '/root/Dockerfile'
3840
dockerfile_test = "#{default_dockerfile}_test.txt"
3941
docker_command = 'docker'
@@ -833,6 +835,35 @@ class { 'docker': #{docker_args} }
833835
apply_manifest(pp_delete, catch_failures: true)
834836
end
835837
end
838+
839+
it 'run with verify_digest' do
840+
pp = <<-EOS
841+
class { 'docker': #{docker_args} }
842+
docker::image { '#{default_image}:#{default_image_tag}':
843+
require => Class['docker'],
844+
}
845+
docker::run { '#{default_image}':
846+
image => '#{default_image}:#{default_image_tag}',
847+
verify_digest => '#{default_local_digest}',
848+
}
849+
EOS
850+
pp_invalid = <<-EOS
851+
docker::run { '#{default_image}':
852+
image => '#{default_image}:#{default_image_tag}',
853+
verify_digest => 'sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc000',
854+
}
855+
EOS
856+
857+
apply_manifest(pp, catch_failures: true)
858+
run_shell('/usr/local/bin/docker-run-alpine-start.sh', expect_failures: false) do |r|
859+
expect(r.stdout.include?('Digest verify failed!')).to be false
860+
end
861+
862+
apply_manifest(pp_invalid, catch_failures: true)
863+
run_shell('/usr/local/bin/docker-run-alpine-start.sh', expect_failures: true) do |r|
864+
expect(r.stdout.include?('Digest verify failed!')).to be true
865+
end
866+
end
836867
end
837868

838869
describe 'docker::exec', win_broken: true do

templates/docker-run-start.erb

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
/usr/bin/<%= @docker_command %> pull <%= @image %>
1010
<% end -%>
1111

12+
<% if @verify_digest -%>
13+
digest_local=$(docker image inspect <%= @image %> --format='{{index .RepoDigests 0}}')
14+
digest_verify="<%= @verify_digest %>"
15+
if [ "${digest_local##*:}" != "${digest_verify##*:}" ]; then
16+
echo "Digest verify failed! Expected checksum 'sha256:$digest_verify' does not match with local checksum 'sha256:$digest_local'!"
17+
exit 2
18+
fi
19+
<% end -%>
20+
1221
/usr/bin/<%= @docker_command %> create \
1322
<%= @docker_run_flags %> \
1423
--name <%= @sanitised_title %> \

0 commit comments

Comments
 (0)