Class: Buildizer::Docker

Inherits:
Object
  • Object
show all
Defined in:
lib/buildizer/docker.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#builderObject (readonly)

Returns the value of attribute builder.



3
4
5
# File 'lib/buildizer/docker.rb', line 3

def builder
  @builder
end

#cacheObject (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

Raises:



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

Raises:



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_pathObject



98
99
100
# File 'lib/buildizer/docker.rb', line 98

def container_build_path
  Pathname.new('/build')
end

#container_extra_pathObject



102
103
104
# File 'lib/buildizer/docker.rb', line 102

def container_extra_path
  Pathname.new('/extra')
end

#container_package_archive_pathObject



90
91
92
# File 'lib/buildizer/docker.rb', line 90

def container_package_archive_path
  Pathname.new('/package.tar.gz')
end

#container_package_mount_pathObject



94
95
96
# File 'lib/buildizer/docker.rb', line 94

def container_package_mount_path
  Pathname.new('/.package')
end

#container_package_pathObject



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

Raises:



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