kontena-cli 1.1.0.pre1 → 1.1.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +3 -9
  3. data/README.md +1 -1
  4. data/VERSION +1 -1
  5. data/examples/kontena-plugin-hello/kontena-plugin-hello.gemspec +1 -1
  6. data/kontena-cli.gemspec +3 -2
  7. data/lib/kontena/cli/cloud/master/add_command.rb +2 -2
  8. data/lib/kontena/cli/grids/common.rb +4 -0
  9. data/lib/kontena/cli/grids/create_command.rb +3 -1
  10. data/lib/kontena/cli/grids/update_command.rb +4 -0
  11. data/lib/kontena/cli/master/config/get_command.rb +4 -0
  12. data/lib/kontena/cli/master/remove_command.rb +10 -13
  13. data/lib/kontena/cli/master/ssh_command.rb +43 -0
  14. data/lib/kontena/cli/master_command.rb +3 -0
  15. data/lib/kontena/cli/nodes/ssh_command.rb +28 -13
  16. data/lib/kontena/cli/registry/create_command.rb +1 -1
  17. data/lib/kontena/cli/stack_command.rb +2 -0
  18. data/lib/kontena/cli/stacks/build_command.rb +25 -21
  19. data/lib/kontena/cli/stacks/common.rb +45 -3
  20. data/lib/kontena/cli/stacks/deploy_command.rb +5 -2
  21. data/lib/kontena/cli/stacks/install_command.rb +7 -3
  22. data/lib/kontena/cli/stacks/list_command.rb +4 -4
  23. data/lib/kontena/cli/stacks/registry/push_command.rb +7 -3
  24. data/lib/kontena/cli/stacks/show_command.rb +2 -1
  25. data/lib/kontena/cli/stacks/stacks_helper.rb +55 -5
  26. data/lib/kontena/cli/stacks/upgrade_command.rb +6 -3
  27. data/lib/kontena/cli/stacks/validate_command.rb +47 -0
  28. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -6
  29. data/lib/kontena/cli/stacks/yaml/reader.rb +189 -100
  30. data/lib/kontena/debug_instrumentor.rb +1 -1
  31. data/lib/kontena_cli.rb +12 -5
  32. data/omnibus/.gitignore +12 -0
  33. data/omnibus/.kitchen.yml +44 -0
  34. data/omnibus/Berksfile +12 -0
  35. data/omnibus/Gemfile +22 -0
  36. data/omnibus/Gemfile.lock +183 -0
  37. data/omnibus/README.md +120 -0
  38. data/omnibus/config/projects/kontena.rb +33 -0
  39. data/omnibus/config/software/kontena.rb +13 -0
  40. data/omnibus/config/software/liblzma.rb +47 -0
  41. data/omnibus/omnibus.rb +56 -0
  42. data/omnibus/package-scripts/kontena/postinst +22 -0
  43. data/omnibus/package-scripts/kontena/postinstall +12 -0
  44. data/omnibus/package-scripts/kontena/postrm +9 -0
  45. data/omnibus/package-scripts/kontena/preinst +7 -0
  46. data/omnibus/package-scripts/kontena/prerm +15 -0
  47. data/omnibus/resources/kontena/pkg/distribution.xml.erb +22 -0
  48. data/omnibus/resources/kontena/pkg/license.html.erb +202 -0
  49. data/omnibus/resources/kontena/pkg/welcome.html.erb +5 -0
  50. data/omnibus/wrappers/sh/kontena +7 -0
  51. data/spec/fixtures/kontena-with-variables.yml +1 -1
  52. data/spec/fixtures/kontena_build_v3.yml +1 -1
  53. data/spec/fixtures/stack-with-invalid-liquid.yml +22 -0
  54. data/spec/fixtures/stack-with-liquid.yml +21 -0
  55. data/spec/fixtures/stack-with-prompted-variables.yml +10 -5
  56. data/spec/fixtures/stack-with-variables.yml +6 -1
  57. data/spec/kontena/cli/cloud/master/add_command_spec.rb +2 -2
  58. data/spec/kontena/cli/services/containers_command_spec.rb +2 -2
  59. data/spec/kontena/cli/stacks/build_command_spec.rb +37 -26
  60. data/spec/kontena/cli/stacks/install_command_spec.rb +6 -1
  61. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +14 -18
  62. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +76 -21
  63. data/spec/kontena/kontena_cli_spec.rb +28 -0
  64. data/spec/support/requirements_helper.rb +20 -2
  65. metadata +46 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3fa4fdfff0c1b90c0954ec7e31f8f916c8636f16
4
- data.tar.gz: 62e78df6ba2b65b1bfcaacde2290d81719d93e82
3
+ metadata.gz: 8e7c1e0f1f4b7150cbb38ae75bd31b5d9c011018
4
+ data.tar.gz: 105cd534097a4479c050b0ca174014c61b327677
5
5
  SHA512:
6
- metadata.gz: e2fb585c59f687236071ec28640e487f32e4b4a1426ef9152249bcdd0651dfb96d0250b1ec91df171e9c0c1b650c257c9bb0e9f2039d8fda9b5a553ddda9c55f
7
- data.tar.gz: 7408e60150cbd48e54549a490af795bb6688af0e01c9969f2f53a20fb8b59417228b3d1fc798e877377a39d28540c9ba8c614a99be110ae86bc74bf07c60716a
6
+ metadata.gz: c8fb7ead66ba6c861d79544f3955b13eadf8e3ceab55fbf3f3a1c108f7bcf23730ee97fccec1cf74b5d2ea8239af9eeb5ac6453b5892eb4b60ddbeda4392d9de
7
+ data.tar.gz: 27978ab4aea44afadff0f59119b993771e36ef3fc4a8688e15d88d3a3cf54525600d70b4d8b5c566790063f8b5a603a25d1a782c0eac8ea81c70805faf2299b1
data/Dockerfile CHANGED
@@ -8,14 +8,8 @@ RUN apk update && \
8
8
  apk --update add ruby ruby-json ruby-bigdecimal ruby-io-console \
9
9
  ca-certificates libssl1.0 openssl libstdc++ && \
10
10
  gem install kontena-cli --no-rdoc --no-ri -v ${CLI_VERSION} && \
11
- adduser kontena -D -h /home/kontena -s /bin/sh && \
12
- echo "gem: --user-install" > /home/kontena/.gemrc && \
13
- chown -R kontena.kontena /home/kontena && \
14
- chmod +sx /usr/local/bin/docker
11
+ chmod +x /usr/local/bin/docker
15
12
 
16
- ENV PATH=$PATH:/home/kontena/.gem/ruby/2.3.0/bin
17
-
18
- VOLUME ["/home/kontena"]
19
- WORKDIR /home/kontena
20
- USER kontena
13
+ VOLUME ["/root"]
14
+ WORKDIR /root
21
15
  ENTRYPOINT ["/usr/bin/kontena"]
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  This is a command line tool for [Kontena](http://www.kontena.io).
5
5
 
6
6
  ## Installation
7
- > Prerequisities: [Ruby](https://www.ruby-lang.org/en/)
7
+ > Prerequisities: [Ruby](https://www.ruby-lang.org/en/) version 2.1.0 or greater.
8
8
 
9
9
  Install it yourself as:
10
10
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0.pre1
1
+ 1.1.0.rc1
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_runtime_dependency 'kontena-cli', '>= 0.16.0.pre2'
19
+ spec.add_runtime_dependency 'kontena-cli', '>= 1.0.0.pre2'
20
20
  spec.add_development_dependency "bundler", "~> 1.11"
21
21
  spec.add_development_dependency "rake", "~> 10.0"
22
22
  end
data/kontena-cli.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = ">= 2.0.0"
21
+ spec.required_ruby_version = ">= 2.1.0"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
@@ -29,7 +29,8 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency "launchy", "~> 2.4.3"
30
30
  spec.add_runtime_dependency "hash_validator", "~> 0.7.0"
31
31
  spec.add_runtime_dependency "retriable", "~> 2.1.0"
32
- spec.add_runtime_dependency "opto", "~> 1.5.3"
32
+ spec.add_runtime_dependency "opto", "~> 1.8.0"
33
33
  spec.add_runtime_dependency "semantic", "~> 1.5"
34
34
  spec.add_runtime_dependency "safe_yaml", "~> 1.0"
35
+ spec.add_runtime_dependency "liquid", "~> 4.0.0"
35
36
  end
@@ -25,7 +25,7 @@ module Kontena::Cli::Cloud::Master
25
25
 
26
26
  def register(name, url = nil, provider = nil, redirect_uri = nil, version = nil, owner = nil)
27
27
  attributes = {}
28
- attributes['name'] = name
28
+ attributes['name'] = name
29
29
  attributes['url'] = url if url
30
30
  attributes['provider'] = provider if provider
31
31
  attributes['redirect-uri'] = redirect_uri if redirect_uri
@@ -107,7 +107,7 @@ module Kontena::Cli::Cloud::Master
107
107
  end
108
108
  else
109
109
  response = spinner "Registering current Kontena Master '#{current_master.name}' #{" as '#{new_name}' " unless new_name == current_master.name}to Kontena Cloud" do
110
- register(new_name, current_master.url, self.provider, nil, self.version)
110
+ register(new_name, current_master.url, self.provider, current_master.url.gsub(/\/$/, '') + "/cb", self.version)
111
111
  end
112
112
  end
113
113
 
@@ -8,6 +8,10 @@ module Kontena::Cli::Grids
8
8
  puts "#{grid['name']}:"
9
9
  puts " uri: #{host.sub('http', 'ws')}"
10
10
  puts " initial_size: #{grid['initial_size']}"
11
+ puts " default_affinity: "
12
+ grid['default_affinity'].to_a.each do |a|
13
+ puts " - #{a}"
14
+ end
11
15
  root_dir = grid['engine_root_dir']
12
16
  nodes = client(require_token).get("grids/#{grid['name']}/nodes")
13
17
  nodes = nodes['nodes'].select{|n| n['connected'] == true }
@@ -10,6 +10,7 @@ module Kontena::Cli::Grids
10
10
  option "--initial-size", "INITIAL_SIZE", "Initial grid size (number of nodes)", default: 1
11
11
  option "--silent", :flag, "Reduce output verbosity"
12
12
  option "--token", "[TOKEN]", "Set grid token"
13
+ option "--default-affinity", "[AFFINITY]", "Default affinity rule for the grid", multivalued: true
13
14
 
14
15
  requires_current_master_token
15
16
 
@@ -18,7 +19,8 @@ module Kontena::Cli::Grids
18
19
  name: name
19
20
  }
20
21
  payload[:token] = self.token if self.token
21
- payload[:initial_size] = initial_size if initial_size
22
+ payload[:initial_size] = self.initial_size if self.initial_size
23
+ payload[:default_affinity] = self.default_affinity_list unless self.default_affinity_list.empty?
22
24
  grid = nil
23
25
  if initial_size == 1
24
26
  warning "Option --initial-size=1 is only recommended for test/dev usage" unless running_silent?
@@ -7,6 +7,7 @@ module Kontena::Cli::Grids
7
7
 
8
8
  parameter "NAME", "Grid name"
9
9
  option "--statsd-server", "STATSD_SERVER", "Statsd server address (host:port)"
10
+ option "--default-affinity", "[AFFINITY]", "Default affinity rule for the grid", multivalued: true
10
11
 
11
12
  def execute
12
13
  require_api_url
@@ -21,6 +22,9 @@ module Kontena::Cli::Grids
21
22
  }
22
23
  }
23
24
  end
25
+ if default_affinity_list
26
+ payload[:default_affinity] = default_affinity_list
27
+ end
24
28
  client(token).put("grids/#{name}", payload)
25
29
  end
26
30
  end
@@ -12,9 +12,13 @@ module Kontena::Cli::Master::Config
12
12
 
13
13
  option ['-p', '--pair'], :flag, "Print key=value instead of only value"
14
14
 
15
+ option '--return', :flag, "Return the value", hidden: true
16
+
15
17
  def execute
16
18
  if self.pair?
17
19
  puts client.get("config/#{self.key}").inspect
20
+ elsif self.return?
21
+ return client.get("config/#{self.key}")[self.key]
18
22
  else
19
23
  puts client.get("config/#{self.key}")[self.key]
20
24
  end
@@ -6,7 +6,7 @@ module Kontena::Cli::Master
6
6
 
7
7
  banner "Note: This command only removes the master from your local configuration file"
8
8
 
9
- option '--force', :flag, "Don't ask questions"
9
+ option '--force', :flag, "Don't ask for confirmation", attribute_name: :forced
10
10
 
11
11
  def run_interactive
12
12
  selections = prompt.multi_select("Select masters to remove from configuration file:") do |menu|
@@ -22,19 +22,15 @@ module Kontena::Cli::Master
22
22
  end
23
23
 
24
24
  def delete_servers(servers)
25
- case servers.size
26
- when 0
27
- abort "Master not found in configuration"
28
- when 1
29
- config.servers.delete(config.servers.delete(servers.first))
30
- puts "Removed Master '#{servers.first.name}'"
31
- else
32
- unless self.force?
33
- abort("Aborted") unless prompt.yes?("Remove #{servers.size} masters from configuration?")
34
- end
35
- config.servers.delete_if {|s| servers.include?(s) }
36
- puts "Removed #{servers.size} masters from configuration"
25
+ abort "Master not found in configuration" if servers.empty?
26
+
27
+ unless forced?
28
+ puts "Removing #{servers.size} master#{"s" if servers.size > 1} from configuration"
29
+ confirm
37
30
  end
31
+
32
+ config.servers.delete_if {|s| servers.include?(s) }
33
+
38
34
  unless config.find_server(config.current_server)
39
35
  puts
40
36
  puts "Current master was removed, to select a new current master use:"
@@ -43,6 +39,7 @@ module Kontena::Cli::Master
43
39
  puts " " + pastel.green.on_black(" kontena master login <master_url> ")
44
40
  config.current_server = nil
45
41
  end
42
+
46
43
  config.write
47
44
  end
48
45
 
@@ -0,0 +1,43 @@
1
+ module Kontena::Cli::Master
2
+ class SshCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+
6
+ parameter "[COMMANDS] ...", "Run command on host"
7
+
8
+ option ["-i", "--identity-file"], "IDENTITY_FILE", "Path to ssh private key"
9
+ option ["-u", "--user"], "USER", "Login as a user", default: "core"
10
+
11
+ requires_current_master
12
+
13
+ def master_host
14
+ require 'uri'
15
+ URI.parse(current_master.url).host
16
+ end
17
+
18
+ def master_provider
19
+ Kontena.run('master config get --return server.provider', returning: :result)
20
+ end
21
+
22
+ def execute
23
+
24
+ commands_list.insert('--') unless commands_list.empty?
25
+
26
+ if master_provider == 'vagrant'
27
+ unless Kontena::PluginManager.instance.plugins.find { |plugin| plugin.name == 'kontena-plugin-vagrant' }
28
+ exit_with_error 'You need to install vagrant plugin to ssh into this node. Use kontena plugin install vagrant'
29
+ end
30
+ cmd = ['vagrant', 'master', 'ssh']
31
+ cmd += commands_list
32
+ Kontena.run(cmd)
33
+ else
34
+ cmd = ['ssh']
35
+ cmd << "#{user}@#{master_host}"
36
+ cmd += ["-i", identity_file] if identity_file
37
+ cmd += commands_list
38
+ exec(*cmd)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
@@ -11,6 +11,7 @@ require_relative 'master/join_command'
11
11
  require_relative 'master/audit_log_command'
12
12
  require_relative 'master/token_command'
13
13
  require_relative 'master/init_cloud_command'
14
+ require_relative 'master/ssh_command'
14
15
 
15
16
  class Kontena::Cli::MasterCommand < Kontena::Command
16
17
  include Kontena::Util
@@ -27,6 +28,8 @@ class Kontena::Cli::MasterCommand < Kontena::Command
27
28
  subcommand "join", "Join Kontena Master using an invitation code", Kontena::Cli::Master::JoinCommand
28
29
  subcommand "audit-log", "Show master audit logs", Kontena::Cli::Master::AuditLogCommand
29
30
  subcommand "init-cloud", "Configure current master to use Kontena Cloud services", Kontena::Cli::Master::InitCloudCommand
31
+ subcommand "ssh", "Connect to the master via SSH", Kontena::Cli::Master::SshCommand
32
+
30
33
  if experimental?
31
34
  require_relative 'master/create_command'
32
35
  subcommand "create", "Install a new Kontena Master", Kontena::Cli::Master::CreateCommand
@@ -4,28 +4,43 @@ module Kontena::Cli::Nodes
4
4
  include Kontena::Cli::GridOptions
5
5
 
6
6
  parameter "NODE_ID", "Node id"
7
+ parameter "[COMMANDS] ...", "Run command on host"
8
+
7
9
  option ["-i", "--identity-file"], "IDENTITY_FILE", "Path to ssh private key"
8
10
  option ["-u", "--user"], "USER", "Login as a user", default: "core"
9
11
  option "--private-ip", :flag, "Connect to node's private IP address"
10
12
  option "--internal-ip", :flag, "Connect to node's internal IP address (requires VPN connection)"
11
13
 
14
+ requires_current_master
15
+ requires_current_grid
16
+
12
17
  def execute
13
- require_api_url
14
- require_current_grid
15
- token = require_token
18
+ node = client.get("nodes/#{current_grid}/#{node_id}")
19
+
20
+ provider = Array(node["labels"]).find{ |l| l.start_with?('provider=')}.to_s.split('=').last
21
+
22
+ commands_list.insert('--') unless commands_list.empty?
16
23
 
17
- node = client(token).get("nodes/#{current_grid}/#{node_id}")
18
- cmd = ['ssh']
19
- cmd << "-i #{identity_file}" if identity_file
20
- if internal_ip?
21
- ip = "10.81.0.#{node['node_number']}"
22
- elsif private_ip?
23
- ip = node['private_ip']
24
+ if provider == 'vagrant'
25
+ unless Kontena::PluginManager.instance.plugins.find { |plugin| plugin.name == 'kontena-plugin-vagrant' }
26
+ exit_with_error 'You need to install vagrant plugin to ssh into this node. Use kontena plugin install vagrant'
27
+ end
28
+ cmd = ['vagrant', 'node', 'ssh', node['name']] + commands_list
29
+ Kontena.run(cmd)
24
30
  else
25
- ip = node['public_ip']
31
+ cmd = ['ssh']
32
+ cmd += ["-i", identity_file] if identity_file
33
+ if internal_ip?
34
+ ip = "10.81.0.#{node['node_number']}"
35
+ elsif private_ip?
36
+ ip = node['private_ip']
37
+ else
38
+ ip = node['public_ip']
39
+ end
40
+ cmd << "#{user}@#{ip}"
41
+ cmd += commands_list
42
+ exec(*cmd)
26
43
  end
27
- cmd << "#{user}@#{ip}"
28
- exec(cmd.join(" "))
29
44
  end
30
45
  end
31
46
  end
@@ -6,7 +6,7 @@ module Kontena::Cli::Registry
6
6
  include Kontena::Cli::GridOptions
7
7
  include Kontena::Cli::Stacks::StacksHelper
8
8
 
9
- REGISTRY_VERSION = '2.2'
9
+ REGISTRY_VERSION = '2.6.0'
10
10
 
11
11
  option '--node', 'NODE', 'Node name'
12
12
  option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
@@ -8,6 +8,7 @@ require_relative 'stacks/build_command'
8
8
  require_relative 'stacks/monitor_command'
9
9
  require_relative 'stacks/logs_command'
10
10
  require_relative 'stacks/registry_command'
11
+ require_relative 'stacks/validate_command'
11
12
 
12
13
  class Kontena::Cli::StackCommand < Kontena::Command
13
14
 
@@ -21,6 +22,7 @@ class Kontena::Cli::StackCommand < Kontena::Command
21
22
  subcommand "monitor", "Monitor services in a stack", Kontena::Cli::Stacks::MonitorCommand
22
23
  subcommand "build", "Build images listed in a stack file and push them to an image registry", Kontena::Cli::Stacks::BuildCommand
23
24
  subcommand ["reg", "registry"], "Stack registry related commands", Kontena::Cli::Stacks::RegistryCommand
25
+ subcommand "validate", "Process and validate a stack file", Kontena::Cli::Stacks::ValidateCommand
24
26
 
25
27
  def execute
26
28
  end
@@ -1,4 +1,5 @@
1
1
  require_relative 'common'
2
+ require 'shellwords'
2
3
 
3
4
  module Kontena::Cli::Stacks
4
5
  class BuildCommand < Kontena::Command
@@ -8,14 +9,23 @@ module Kontena::Cli::Stacks
8
9
  banner "Build images listed in a stack file and push them to your image registry"
9
10
 
10
11
  option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
12
+
11
13
  option ['--no-cache'], :flag, 'Do not use cache when building the image', default: false
12
14
  option ['--no-push'], :flag, 'Do not push images to registry', default: false
13
15
  option ['--no-pull'], :flag, 'Do not attempt to pull a newer version of the image', default: false
16
+ option ['--[no-]sudo'], :flag, 'Run docker using sudo', hidden: Kontena.on_windows?, environment_variable: 'KONTENA_SUDO', default: false
17
+
18
+ option ['-n', '--name'], 'NAME', 'Define stack name (by default comes from stack file)'
19
+ include Common::StackValuesFromOption
20
+
14
21
  parameter "[SERVICE] ...", "Services to build"
15
22
 
23
+ requires_current_master # the stack may use a vault resolver
24
+ requires_current_master_token
25
+
16
26
  def execute
17
27
  require_config_file(filename)
18
- stack = stack_from_yaml(filename)
28
+ stack = stack_from_yaml(filename, name: name, values: values)
19
29
  services = stack['services']
20
30
 
21
31
  unless service_list.empty?
@@ -25,25 +35,23 @@ module Kontena::Cli::Stacks
25
35
  if services.none?{ |service| service['build'] }
26
36
  abort 'Not found any service with a build option'.colorize(:red)
27
37
  end
28
- build_docker_images(services, no_cache?, no_pull?)
38
+ build_docker_images(services)
29
39
  push_docker_images(services) unless no_push?
30
40
  end
31
41
 
32
42
  # @param [Hash] services
33
- # @param [Boolean] no_cache
34
- # @param [Boolean] no_pull
35
- def build_docker_images(services, no_cache = false, no_pull = false)
43
+ def build_docker_images(services)
36
44
  services.each do |service|
37
45
  if service['build']
38
46
  dockerfile = service['build']['dockerfile'] || 'Dockerfile'
39
- abort("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
47
+ abort("'#{service['image']}' is not valid Docker image name") unless valid_image_name?(service['image'])
40
48
  abort("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
41
49
  if service['hooks'] && service['hooks']['pre_build']
42
50
  puts "Running pre_build hook".colorize(:cyan)
43
51
  run_pre_build_hook(service['hooks']['pre_build'])
44
52
  end
45
53
  puts "Building image #{service['image'].colorize(:cyan)}"
46
- build_docker_image(service, no_cache, no_pull)
54
+ build_docker_image(service)
47
55
  end
48
56
  end
49
57
  end
@@ -59,16 +67,16 @@ module Kontena::Cli::Stacks
59
67
  end
60
68
 
61
69
  # @param [Hash] service
62
- # @param [Boolean] no_cache
63
- # @param [Boolean] no_pull
64
70
  # @return [Integer]
65
- def build_docker_image(service, no_cache = false, no_pull = false)
71
+ def build_docker_image(service)
66
72
  dockerfile = dockerfile = service['build']['dockerfile'] || 'Dockerfile'
67
73
  build_context = service['build']['context']
68
74
  cmd = ['docker', 'build', '-t', service['image']]
69
75
  cmd << ['-f', File.join(File.expand_path(build_context), dockerfile)] if dockerfile != "Dockerfile"
70
- cmd << '--no-cache' if no_cache
71
- cmd << '--pull' unless no_pull
76
+ cmd << '--no-cache' if no_cache?
77
+ cmd << '--pull' unless no_pull?
78
+ cmd.unshift('sudo') if sudo?
79
+
72
80
  args = service['build']['args'] || {}
73
81
  args.each do |k, v|
74
82
  cmd << "--build-arg=#{k}=#{v}"
@@ -82,21 +90,17 @@ module Kontena::Cli::Stacks
82
90
  # @param [String] image
83
91
  # @return [Integer]
84
92
  def push_docker_image(image)
85
- ret = system('docker', 'push', image)
93
+ cmd = ['docker', 'push', image]
94
+ cmd.unshift('sudo') if sudo?
95
+ ret = system(*cmd)
86
96
  raise ("Failed to push image #{image.colorize(:cyan)}") unless ret
87
97
  ret
88
98
  end
89
99
 
90
100
  # @param [String] name
91
101
  # @return [Boolean]
92
- def validate_image_name(name)
93
- !(/^[\w.\/\-:]+:?+[\w+.]+$/ =~ name).nil?
94
- end
95
-
96
- # @param [String] image
97
- # @return [Boolean]
98
- def image_exist?(image)
99
- system("docker history '#{image}' >/dev/null 2>/dev/null")
102
+ def valid_image_name?(name)
103
+ !(/\A[\w.\/\-:]+:?+[\w+.]+\z/ =~ name).nil?
100
104
  end
101
105
 
102
106
  # @param [String] path