Merge pull request #48 from chef/docker-concurrency

Docker concurrency
This commit is contained in:
Christoph Hartmann 2015-09-24 18:14:51 +02:00
commit 0b2d14894a

View file

@ -20,7 +20,8 @@ class DockerRunner
end end
@images = docker_images_by_tag @images = docker_images_by_tag
@image_pull = Concurrent::Promise.execute { true } @image_pull_tickets = Concurrent::Semaphore.new(2)
@docker_run_tickets = Concurrent::Semaphore.new(5)
end end
def run_all(&block) def run_all(&block)
@ -87,22 +88,18 @@ class DockerRunner
version ||= 'latest' version ||= 'latest'
name = "#{name}:#{version}" name = "#{name}:#{version}"
end end
puts "--> schedule docker #{name}"
image = @images[name] image = @images[name]
if image.nil? if image.nil?
puts "\033[35;1m--> pull docker images #{name} "\ puts "\033[35;1m--> pull docker images #{name} "\
"(this may take a while)\033[0m" "(this may take a while)\033[0m"
pull = @image_pull.then do @image_pull_tickets.acquire(1)
puts "... start pull image #{name}" puts "... start pull image #{name}"
Docker::Image.create('fromImage' => name) image = Docker::Image.create('fromImage' => name)
end @image_pull_tickets.release(1)
cur = pull.rescue { nil }
@image_pull = cur
sleep(0.1) until cur.fulfilled?
image = cur.value
unless image.nil? unless image.nil?
puts "\033[35;1m--> pull docker images finished for #{name}\033[0m" puts "\033[35;1m--> pull docker images finished for #{name}\033[0m"
end end
@ -112,6 +109,8 @@ class DockerRunner
image, scripts = bootstrap_image(name, image) image, scripts = bootstrap_image(name, image)
@docker_run_tickets.acquire(1)
puts "--> start docker #{name}" puts "--> start docker #{name}"
container = Docker::Container.create( container = Docker::Container.create(
'Cmd' => %w{sleep 3600}, 'Cmd' => %w{sleep 3600},
@ -129,6 +128,7 @@ class DockerRunner
end end
def stop_container(container) def stop_container(container)
@docker_run_tickets.release(1)
puts "--> killrm docker #{container.id}" puts "--> killrm docker #{container.id}"
container.kill container.kill
container.delete(force: true) container.delete(force: true)