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.
- checksums.yaml +4 -4
- data/Dockerfile +3 -9
- data/README.md +1 -1
- data/VERSION +1 -1
- data/examples/kontena-plugin-hello/kontena-plugin-hello.gemspec +1 -1
- data/kontena-cli.gemspec +3 -2
- data/lib/kontena/cli/cloud/master/add_command.rb +2 -2
- data/lib/kontena/cli/grids/common.rb +4 -0
- data/lib/kontena/cli/grids/create_command.rb +3 -1
- data/lib/kontena/cli/grids/update_command.rb +4 -0
- data/lib/kontena/cli/master/config/get_command.rb +4 -0
- data/lib/kontena/cli/master/remove_command.rb +10 -13
- data/lib/kontena/cli/master/ssh_command.rb +43 -0
- data/lib/kontena/cli/master_command.rb +3 -0
- data/lib/kontena/cli/nodes/ssh_command.rb +28 -13
- data/lib/kontena/cli/registry/create_command.rb +1 -1
- data/lib/kontena/cli/stack_command.rb +2 -0
- data/lib/kontena/cli/stacks/build_command.rb +25 -21
- data/lib/kontena/cli/stacks/common.rb +45 -3
- data/lib/kontena/cli/stacks/deploy_command.rb +5 -2
- data/lib/kontena/cli/stacks/install_command.rb +7 -3
- data/lib/kontena/cli/stacks/list_command.rb +4 -4
- data/lib/kontena/cli/stacks/registry/push_command.rb +7 -3
- data/lib/kontena/cli/stacks/show_command.rb +2 -1
- data/lib/kontena/cli/stacks/stacks_helper.rb +55 -5
- data/lib/kontena/cli/stacks/upgrade_command.rb +6 -3
- data/lib/kontena/cli/stacks/validate_command.rb +47 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -6
- data/lib/kontena/cli/stacks/yaml/reader.rb +189 -100
- data/lib/kontena/debug_instrumentor.rb +1 -1
- data/lib/kontena_cli.rb +12 -5
- data/omnibus/.gitignore +12 -0
- data/omnibus/.kitchen.yml +44 -0
- data/omnibus/Berksfile +12 -0
- data/omnibus/Gemfile +22 -0
- data/omnibus/Gemfile.lock +183 -0
- data/omnibus/README.md +120 -0
- data/omnibus/config/projects/kontena.rb +33 -0
- data/omnibus/config/software/kontena.rb +13 -0
- data/omnibus/config/software/liblzma.rb +47 -0
- data/omnibus/omnibus.rb +56 -0
- data/omnibus/package-scripts/kontena/postinst +22 -0
- data/omnibus/package-scripts/kontena/postinstall +12 -0
- data/omnibus/package-scripts/kontena/postrm +9 -0
- data/omnibus/package-scripts/kontena/preinst +7 -0
- data/omnibus/package-scripts/kontena/prerm +15 -0
- data/omnibus/resources/kontena/pkg/distribution.xml.erb +22 -0
- data/omnibus/resources/kontena/pkg/license.html.erb +202 -0
- data/omnibus/resources/kontena/pkg/welcome.html.erb +5 -0
- data/omnibus/wrappers/sh/kontena +7 -0
- data/spec/fixtures/kontena-with-variables.yml +1 -1
- data/spec/fixtures/kontena_build_v3.yml +1 -1
- data/spec/fixtures/stack-with-invalid-liquid.yml +22 -0
- data/spec/fixtures/stack-with-liquid.yml +21 -0
- data/spec/fixtures/stack-with-prompted-variables.yml +10 -5
- data/spec/fixtures/stack-with-variables.yml +6 -1
- data/spec/kontena/cli/cloud/master/add_command_spec.rb +2 -2
- data/spec/kontena/cli/services/containers_command_spec.rb +2 -2
- data/spec/kontena/cli/stacks/build_command_spec.rb +37 -26
- data/spec/kontena/cli/stacks/install_command_spec.rb +6 -1
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +14 -18
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +76 -21
- data/spec/kontena/kontena_cli_spec.rb +28 -0
- data/spec/support/requirements_helper.rb +20 -2
- metadata +46 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8e7c1e0f1f4b7150cbb38ae75bd31b5d9c011018
|
|
4
|
+
data.tar.gz: 105cd534097a4479c050b0ca174014c61b327677
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
-
|
|
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
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.1.0.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
93
|
-
!(
|
|
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
|