kontena-cli 1.1.0.pre1 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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