Class: Buildizer::Docker
- Inherits:
-
Object
- Object
- Buildizer::Docker
- Defined in:
- lib/buildizer/docker.rb
Instance Attribute Summary collapse
-
#builder ⇒ Object
readonly
Returns the value of attribute builder.
-
#cache ⇒ Object
readonly
Returns the value of attribute cache.
Instance Method Summary collapse
- #_common_docker_params(target, env) ⇒ Object
- #_make_cmd(cmd) ⇒ Object
- #_wrap_docker_exec(cmd) ⇒ Object
- #_wrap_docker_run(cmd) ⇒ Object
- #build_image!(target) ⇒ Object
- #cache_login! ⇒ Object
- #cache_logout! ⇒ Object
- #container_build_path ⇒ Object
- #container_extra_path ⇒ Object
- #container_package_archive_path ⇒ Object
- #container_package_mount_path ⇒ Object
- #container_package_path ⇒ Object
- #image_klass(os_name, os_version) ⇒ Object
-
#initialize(builder, cache: nil) ⇒ Docker
constructor
A new instance of Docker.
- #new_image(os_name, os_version, **kwargs) ⇒ Object
- #pull_image(image) ⇒ Object
- #push_image(image) ⇒ Object
- #run_in_container!(container:, cmd:, desc: nil) ⇒ Object
- #run_in_image!(target:, cmd:, env: {}, desc: nil) ⇒ Object
- #run_target_container!(target:, env: {}) ⇒ Object
- #shutdown_container!(container:) ⇒ Object
- #with_cache(&blk) ⇒ Object
Constructor Details
#initialize(builder, cache: nil) ⇒ Docker
Returns a new instance of Docker.
6 7 8 9 |
# File 'lib/buildizer/docker.rb', line 6 def initialize(builder, cache: nil) @builder = builder @cache = cache end |
Instance Attribute Details
#builder ⇒ Object (readonly)
Returns the value of attribute builder.
3 4 5 |
# File 'lib/buildizer/docker.rb', line 3 def builder @builder end |
#cache ⇒ Object (readonly)
Returns the value of attribute cache.
4 5 6 |
# File 'lib/buildizer/docker.rb', line 4 def cache @cache end |
Instance Method Details
#_common_docker_params(target, env) ⇒ Object
136 137 138 139 140 141 142 |
# File 'lib/buildizer/docker.rb', line 136 def _common_docker_params(target, env) [*env.map {|k,v| "-e #{k}=#{v}"}, "-v #{builder.packager.package_path}:#{container_package_mount_path}:ro", "-v #{target.image_extra_path}:#{container_extra_path}:ro", "-v #{target.image_build_path}:#{container_build_path}", target.image.name] end |
#_make_cmd(cmd) ⇒ Object
152 153 154 |
# File 'lib/buildizer/docker.rb', line 152 def _make_cmd(cmd) Array(cmd).join('; ') end |
#_wrap_docker_exec(cmd) ⇒ Object
144 145 146 |
# File 'lib/buildizer/docker.rb', line 144 def _wrap_docker_exec(cmd) "/bin/bash -lec '#{_make_cmd(cmd)}'" end |
#_wrap_docker_run(cmd) ⇒ Object
148 149 150 |
# File 'lib/buildizer/docker.rb', line 148 def _wrap_docker_run(cmd) "'#{['set -e', _make_cmd(cmd)].join('; ')}'" end |
#build_image!(target) ⇒ Object
76 77 78 79 80 81 82 83 84 |
# File 'lib/buildizer/docker.rb', line 76 def build_image!(target) pull_image target.image target.image_work_path.join('Dockerfile').write [*target.image.instructions, nil].join("\n") builder.packager.command! "docker build -t #{target.image.name} #{target.image_work_path}", desc: "Docker build image #{target.image.name}" push_image target.image end |
#cache_login! ⇒ Object
47 48 49 50 51 52 53 54 55 56 |
# File 'lib/buildizer/docker.rb', line 47 def cache_login! raise Error, error: :logical_error, message: "no docker cache account info" unless cache cmd = ["docker login"] cmd << "--email=#{cache[:email]}" if cache[:email] cmd << "--username=#{cache[:username]}" if cache[:username] cmd << "--password=#{cache[:password]}" if cache[:password] cmd << "--server=#{cache[:server]}" if cache[:server] builder.packager.command! cmd.join(' '), desc: "Docker cache account login" end |
#cache_logout! ⇒ Object
58 59 60 61 |
# File 'lib/buildizer/docker.rb', line 58 def cache_logout! raise Error, error: :logical_error, message: "no docker cache account info" unless cache builder.packager.command! 'docker logout', desc: "Docker cache account logout" end |
#container_build_path ⇒ Object
98 99 100 |
# File 'lib/buildizer/docker.rb', line 98 def container_build_path Pathname.new('/build') end |
#container_extra_path ⇒ Object
102 103 104 |
# File 'lib/buildizer/docker.rb', line 102 def container_extra_path Pathname.new('/extra') end |
#container_package_archive_path ⇒ Object
90 91 92 |
# File 'lib/buildizer/docker.rb', line 90 def container_package_archive_path Pathname.new('/package.tar.gz') end |
#container_package_mount_path ⇒ Object
94 95 96 |
# File 'lib/buildizer/docker.rb', line 94 def container_package_mount_path Pathname.new('/.package') end |
#container_package_path ⇒ Object
86 87 88 |
# File 'lib/buildizer/docker.rb', line 86 def container_package_path Pathname.new('/package') end |
#image_klass(os_name, os_version) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/buildizer/docker.rb', line 11 def image_klass(os_name, os_version) ({ 'ubuntu' => { '12.04' => Image::Ubuntu1204, '14.04' => Image::Ubuntu1404, '16.04' => Image::Ubuntu1604, nil => Image::Ubuntu1404, }, 'centos' => { 'centos6' => Image::Centos6, 'centos7' => Image::Centos7, nil => Image::Centos7, }, }[os_name] || {})[os_version] end |
#new_image(os_name, os_version, **kwargs) ⇒ Object
27 28 29 30 31 |
# File 'lib/buildizer/docker.rb', line 27 def new_image(os_name, os_version, **kwargs) klass = image_klass(os_name, os_version) raise Error, message: "unknown os '#{[os_name, os_version].compact.join('-')}'" unless klass klass.new(self, **kwargs) end |
#pull_image(image) ⇒ Object
63 64 65 66 67 68 69 |
# File 'lib/buildizer/docker.rb', line 63 def pull_image(image) builder.packager.command!("docker pull #{image.base_image}", desc: "Docker pull #{image.base_image}") builder.packager.command("docker pull #{image.name}", desc: "Docker pull #{image.name}") if cache end |
#push_image(image) ⇒ Object
71 72 73 74 |
# File 'lib/buildizer/docker.rb', line 71 def push_image(image) builder.packager.command("docker push #{image.name}", desc: "Docker push #{image.name}") if cache end |
#run_in_container!(container:, cmd:, desc: nil) ⇒ Object
121 122 123 124 125 126 |
# File 'lib/buildizer/docker.rb', line 121 def run_in_container!(container:, cmd:, desc: nil) builder.packager.command! [ "docker exec #{container}", _wrap_docker_exec(cmd), ].join(' '), timeout: 24*60*60, desc: desc end |
#run_in_image!(target:, cmd:, env: {}, desc: nil) ⇒ Object
128 129 130 131 132 133 134 |
# File 'lib/buildizer/docker.rb', line 128 def run_in_image!(target:, cmd:, env: {}, desc: nil) builder.packager.command! [ "docker run --rm", *Array(_common_docker_params(target, env)), _wrap_docker_run(cmd), ].join(' '), timeout: 24*60*60, desc: desc end |
#run_target_container!(target:, env: {}) ⇒ Object
106 107 108 109 110 111 112 113 114 |
# File 'lib/buildizer/docker.rb', line 106 def run_target_container!(target:, env: {}) container = SecureRandom.uuid builder.packager.command! [ "docker run --detach --name #{container}", *Array(_common_docker_params(target, env)), _wrap_docker_run("while true ; do sleep 1 ; done"), ].join(' '), desc: "Run container '#{container}' from docker image '#{target.image.name}'" container end |
#shutdown_container!(container:) ⇒ Object
116 117 118 119 |
# File 'lib/buildizer/docker.rb', line 116 def shutdown_container!(container:) builder.packager.command! "docker kill #{container}", desc: "Kill container '#{container}'" builder.packager.command! "docker rm #{container}", desc: "Remove container '#{container}'" end |
#with_cache(&blk) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/buildizer/docker.rb', line 33 def with_cache(&blk) warn("No docker cache account settings " + "(BUILDIZER_DOCKER_CACHE, BUILDIZER_DOCKER_CACHE_USERNAME, " + "BUILDIZER_DOCKER_CACHE_PASSWORD, BUILDIZER_DOCKER_CACHE_EMAIL, " + "BUILDIZER_DOCKER_CACHE_SERVER) [WARN]") unless cache cache_login! if cache begin yield if block_given? ensure cache_logout! if cache end end |