Properly define service build within composition. Full cleanup on destroy.

This commit is contained in:
Chris Roberts 2017-05-11 14:01:42 -07:00
parent b333e5cd82
commit 4673bbb907
1 changed files with 56 additions and 18 deletions

View File

@ -32,15 +32,44 @@ module VagrantPlugins
end
def build(dir, **opts, &block)
@logger.debug("Applying build using `#{dir}` directory.")
name = machine.name.to_s
@logger.debug("Applying build for `#{name}` using `#{dir}` directory.")
begin
update_composition(:apply) do |composition|
composition["build"] = dir
services = composition["services"] ||= {}
services[name] ||= {}
services[name]["build"] = {"context" => dir}
# Extract custom dockerfile location if set
if opts[:extra_args] && opts[:extra_args].include?("--file")
services[name]["build"]["dockerfile"] = opts[:extra_args][opts[:extra_args].index("--file") + 1]
end
# Extract any build args that can be found
case opts[:build_args]
when Array
if opts[:build_args].include?("--build-arg")
idx = 0
build_args = {}
while(idx < opts[:build_args].size)
arg_value = opts[:build_args][idx]
idx += 1
if arg_value.start_with?("--build-arg")
if !arg_value.include?("=")
arg_value = opts[:build_args][idx]
idx += 1
end
key, val = arg_value.to_s.split("=", 2).to_s.split("=")
build_args[key] = val
end
end
end
when Hash
services[name]["build"]["args"] = opts[:build_args]
end
end
rescue => error
@logger.error("Failed to apply build using `#{dir}` directory: #{error.class} - #{error}")
update_composition do |composition|
composition.delete("build")
composition["services"].delete(name)
end
raise
end
@ -61,7 +90,8 @@ module VagrantPlugins
begin
update_composition(:apply) do |composition|
services = composition["services"] ||= {}
services[name] = {
services[name] ||= {}
services[name].merge(
"image" => image,
"environment" => env,
"expose" => expose,
@ -69,7 +99,7 @@ module VagrantPlugins
"volumes" => volumes,
"links" => links,
"command" => cmd
}
)
end
rescue => error
@logger.error("Failed to create container `#{name}`: #{error.class} - #{error}")
@ -84,24 +114,32 @@ module VagrantPlugins
def rm(cid)
if created?(cid)
destroy = false
compose_execute("rm", "-f", machine.name.to_s)
update_composition(:conditional_apply) do |composition|
if composition["services"] && composition["services"].key?(machine.name.to_s)
@logger.info("Removing container `#{machine.name}`")
composition["services"].delete(machine.name.to_s)
destroy = composition["services"].empty?
synchronized do
compose_execute("rm", "-f", machine.name.to_s)
update_composition do |composition|
if composition["services"] && composition["services"].key?(machine.name.to_s)
@logger.info("Removing container `#{machine.name}`")
if composition["services"].size > 1
composition["services"].delete(machine.name.to_s)
else
destroy = true
end
end
end
if destroy
@logger.info("No containers remain. Destroying full environment.")
compose_execute("down", "--volumes", "--rmi", "local")
@logger.info("Deleting composition path `#{composition_path}`")
composition_path.delete
end
!destroy
end
if destroy
@logger.info("No containers remain. Destroying full environment.")
compose_execute("down", "--remove-orphans", "--volumes", "--rmi", "local")
@logger.info("Deleting composition path `#{composition_path}`")
composition_path.delete
end
end
end
def rmi(*_)
true
end
def created?(cid)
result = super
if !result