kontena-cli 0.13.4 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/kontena-cli.gemspec +2 -0
- data/lib/kontena/cli/app_command.rb +2 -0
- data/lib/kontena/cli/apps/common.rb +80 -74
- data/lib/kontena/cli/apps/config_command.rb +29 -0
- data/lib/kontena/cli/apps/deploy_command.rb +12 -81
- data/lib/kontena/cli/apps/docker_helper.rb +3 -3
- data/lib/kontena/cli/apps/init_command.rb +0 -3
- data/lib/kontena/cli/apps/list_command.rb +2 -3
- data/lib/kontena/cli/apps/logs_command.rb +2 -3
- data/lib/kontena/cli/apps/monitor_command.rb +3 -4
- data/lib/kontena/cli/apps/remove_command.rb +4 -4
- data/lib/kontena/cli/apps/restart_command.rb +2 -3
- data/lib/kontena/cli/apps/scale_command.rb +3 -5
- data/lib/kontena/cli/apps/service_generator.rb +123 -0
- data/lib/kontena/cli/apps/service_generator_v2.rb +26 -0
- data/lib/kontena/cli/apps/show_command.rb +1 -2
- data/lib/kontena/cli/apps/start_command.rb +2 -3
- data/lib/kontena/cli/apps/stop_command.rb +2 -3
- data/lib/kontena/cli/apps/yaml/reader.rb +150 -0
- data/lib/kontena/cli/apps/yaml/service_extender.rb +60 -0
- data/lib/kontena/cli/apps/yaml/validations.rb +79 -0
- data/lib/kontena/cli/apps/yaml/validator.rb +55 -0
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +74 -0
- data/lib/kontena/cli/common.rb +23 -0
- data/lib/kontena/cli/etcd/remove_command.rb +2 -0
- data/lib/kontena/cli/grids/remove_command.rb +2 -0
- data/lib/kontena/cli/grids/users/remove_command.rb +3 -0
- data/lib/kontena/cli/master/azure/create_command.rb +0 -2
- data/lib/kontena/cli/master/packet/create_command.rb +42 -0
- data/lib/kontena/cli/master/packet_command.rb +14 -0
- data/lib/kontena/cli/master/upcloud/create_command.rb +39 -0
- data/lib/kontena/cli/master/upcloud_command.rb +13 -0
- data/lib/kontena/cli/master/users/remove_command.rb +3 -0
- data/lib/kontena/cli/master/users/roles/remove_command.rb +2 -0
- data/lib/kontena/cli/master_command.rb +4 -0
- data/lib/kontena/cli/node_command.rb +4 -0
- data/lib/kontena/cli/nodes/azure/create_command.rb +0 -2
- data/lib/kontena/cli/nodes/list_command.rb +4 -8
- data/lib/kontena/cli/nodes/packet/create_command.rb +35 -0
- data/lib/kontena/cli/nodes/packet/restart_command.rb +17 -0
- data/lib/kontena/cli/nodes/packet/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/packet_command.rb +15 -0
- data/lib/kontena/cli/nodes/remove_command.rb +2 -0
- data/lib/kontena/cli/nodes/show_command.rb +3 -1
- data/lib/kontena/cli/nodes/upcloud/create_command.rb +33 -0
- data/lib/kontena/cli/nodes/upcloud/restart_command.rb +20 -0
- data/lib/kontena/cli/nodes/upcloud/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/upcloud_command.rb +15 -0
- data/lib/kontena/cli/registry/remove_command.rb +3 -0
- data/lib/kontena/cli/services/remove_command.rb +2 -0
- data/lib/kontena/cli/services/services_helper.rb +1 -0
- data/lib/kontena/cli/vault/list_command.rb +2 -0
- data/lib/kontena/cli/vault/read_command.rb +2 -0
- data/lib/kontena/cli/vault/remove_command.rb +4 -0
- data/lib/kontena/cli/vault/update_command.rb +8 -1
- data/lib/kontena/cli/vault/write_command.rb +2 -0
- data/lib/kontena/cli/vpn/remove_command.rb +3 -0
- data/lib/kontena/machine/azure/master_provisioner.rb +2 -2
- data/lib/kontena/machine/azure/node_provisioner.rb +7 -4
- data/lib/kontena/machine/digital_ocean/node_provisioner.rb +1 -1
- data/lib/kontena/machine/packet.rb +17 -0
- data/lib/kontena/machine/packet/cloudinit.yml +66 -0
- data/lib/kontena/machine/packet/cloudinit_master.yml +118 -0
- data/lib/kontena/machine/packet/master_provisioner.rb +93 -0
- data/lib/kontena/machine/packet/node_destroyer.rb +42 -0
- data/lib/kontena/machine/packet/node_provisioner.rb +77 -0
- data/lib/kontena/machine/packet/node_restarter.rb +41 -0
- data/lib/kontena/machine/packet/packet_common.rb +89 -0
- data/lib/kontena/machine/upcloud.rb +9 -0
- data/lib/kontena/machine/upcloud/cloudinit.yml +64 -0
- data/lib/kontena/machine/upcloud/cloudinit_master.yml +118 -0
- data/lib/kontena/machine/upcloud/master_provisioner.rb +136 -0
- data/lib/kontena/machine/upcloud/node_destroyer.rb +82 -0
- data/lib/kontena/machine/upcloud/node_provisioner.rb +119 -0
- data/lib/kontena/machine/upcloud/node_restarter.rb +47 -0
- data/lib/kontena/machine/upcloud/upcloud_common.rb +70 -0
- data/lib/kontena/scripts/completer +8 -3
- data/spec/fixtures/docker-compose_v2.yml +10 -0
- data/spec/fixtures/kontena-invalid.yml +4 -0
- data/spec/fixtures/kontena-with-variables.yml +19 -0
- data/spec/fixtures/kontena.yml +2 -2
- data/spec/fixtures/kontena_v2.yml +35 -0
- data/spec/kontena/cli/app/common_spec.rb +39 -101
- data/spec/kontena/cli/app/deploy_command_spec.rb +37 -388
- data/spec/kontena/cli/app/docker_helper_spec.rb +4 -4
- data/spec/kontena/cli/app/service_generator_spec.rb +374 -0
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +74 -0
- data/spec/kontena/cli/app/yaml/reader_spec.rb +249 -0
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +104 -0
- data/spec/kontena/cli/app/yaml/validator_spec.rb +263 -0
- data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +309 -0
- data/spec/kontena/cli/common_spec.rb +39 -1
- data/spec/kontena/cli/master/users/remove_command_spec.rb +9 -0
- data/spec/kontena/cli/master/users/roles/remove_command_spec.rb +2 -0
- metadata +86 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13295c1c17a8bc5e8a328ba103a1ce03d22f083e
|
4
|
+
data.tar.gz: d1c228f5eb5decefb19bf73892858161f69da2ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cac1ed8d7f6c2f44621b7d3ccef67555b732a20e89e8213d9651f66c7b3b0f894826d7f25d176185600045c85b0b543cc23e4f10e0bd481c7b5dc626f7914b79
|
7
|
+
data.tar.gz: 770733acf831c0f155289952ec31a03cfbcbc1b3acb45ed7cce7d4bceee8e51c89c0ab68ba9451a90e174016725278ae72918db48aad11a26beb1cc9899c0cb5
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.14.0
|
data/kontena-cli.gemspec
CHANGED
@@ -28,4 +28,6 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_runtime_dependency 'highline'
|
29
29
|
spec.add_runtime_dependency 'shell-spinner'
|
30
30
|
spec.add_runtime_dependency 'ruby_dig'
|
31
|
+
spec.add_runtime_dependency 'dry-validation', "0.7.4"
|
32
|
+
spec.add_runtime_dependency 'dry-logic', "0.2.2"
|
31
33
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'apps/init_command'
|
2
2
|
require_relative 'apps/build_command'
|
3
|
+
require_relative 'apps/config_command'
|
3
4
|
require_relative 'apps/deploy_command'
|
4
5
|
require_relative 'apps/start_command'
|
5
6
|
require_relative 'apps/stop_command'
|
@@ -15,6 +16,7 @@ class Kontena::Cli::AppCommand < Clamp::Command
|
|
15
16
|
|
16
17
|
subcommand "init", "Init Kontena application", Kontena::Cli::Apps::InitCommand
|
17
18
|
subcommand "build", "Build Kontena services", Kontena::Cli::Apps::BuildCommand
|
19
|
+
subcommand "config", "View service configurations", Kontena::Cli::Apps::ConfigCommand
|
18
20
|
subcommand "deploy", "Deploy Kontena services", Kontena::Cli::Apps::DeployCommand
|
19
21
|
subcommand "scale", "Scale services", Kontena::Cli::Apps::ScaleCommand
|
20
22
|
subcommand "start", "Start services", Kontena::Cli::Apps::StartCommand
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require_relative '../services/services_helper'
|
3
|
+
require_relative './service_generator'
|
4
|
+
require_relative './service_generator_v2'
|
5
|
+
require_relative './yaml/reader'
|
3
6
|
|
4
7
|
module Kontena::Cli::Apps
|
5
8
|
module Common
|
@@ -13,12 +16,55 @@ module Kontena::Cli::Apps
|
|
13
16
|
# @param [Array<String>] service_list
|
14
17
|
# @param [String] prefix
|
15
18
|
# @return [Hash]
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
+
def services_from_yaml(filename, service_list, prefix)
|
20
|
+
set_env_variables(prefix, current_grid)
|
21
|
+
reader = YAML::Reader.new(filename)
|
22
|
+
outcome = reader.execute
|
23
|
+
hint_on_validation_notifications(outcome[:notifications]) if outcome[:notifications].size > 0
|
24
|
+
abort_on_validation_errors(outcome[:errors]) if outcome[:errors].size > 0
|
25
|
+
kontena_services = generate_services(outcome[:services], outcome[:version])
|
26
|
+
kontena_services.delete_if { |name, service| !service_list.include?(name)} unless service_list.empty?
|
27
|
+
kontena_services
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# @param [Hash] yaml
|
32
|
+
# @param [String] version
|
33
|
+
# @return [Hash]
|
34
|
+
def generate_services(yaml_services, version)
|
35
|
+
services = {}
|
36
|
+
if version == '2'
|
37
|
+
generator_klass = ServiceGeneratorV2
|
38
|
+
else
|
39
|
+
generator_klass = ServiceGenerator
|
40
|
+
end
|
41
|
+
yaml_services.each do |service_name, config|
|
42
|
+
abort("Image is missing for #{service_name}. Aborting.") unless config['image']
|
43
|
+
services[service_name] = generator_klass.new(config).generate
|
44
|
+
end
|
19
45
|
services
|
20
46
|
end
|
21
47
|
|
48
|
+
def set_env_variables(project, grid)
|
49
|
+
ENV['project'] = project
|
50
|
+
ENV['grid'] = grid
|
51
|
+
end
|
52
|
+
|
53
|
+
def service_prefix
|
54
|
+
@service_prefix ||= project_name || project_name_from_yaml(filename) || current_dir
|
55
|
+
end
|
56
|
+
|
57
|
+
def project_name_from_yaml(file)
|
58
|
+
reader = YAML::Reader.new(file, true)
|
59
|
+
outcome = reader.execute
|
60
|
+
if outcome[:version] == '2'
|
61
|
+
outcome[:name]
|
62
|
+
else
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
22
68
|
# @return [String]
|
23
69
|
def token
|
24
70
|
@token ||= require_token
|
@@ -28,7 +74,6 @@ module Kontena::Cli::Apps
|
|
28
74
|
# @return [String]
|
29
75
|
def prefixed_name(name)
|
30
76
|
return name if service_prefix.strip == ""
|
31
|
-
|
32
77
|
"#{service_prefix}-#{name}"
|
33
78
|
end
|
34
79
|
|
@@ -43,76 +88,6 @@ module Kontena::Cli::Apps
|
|
43
88
|
get_service(token, prefixed_name(name)) rescue false
|
44
89
|
end
|
45
90
|
|
46
|
-
# @param [String] file
|
47
|
-
# @param [String,NilClass] name
|
48
|
-
# @param [String] prefix
|
49
|
-
# @return [Hash]
|
50
|
-
def parse_services(file, name = nil, prefix = '')
|
51
|
-
services = YAML.load(File.read(File.expand_path(file)) % {project: prefix, grid: current_grid})
|
52
|
-
Dir.chdir(File.dirname(File.expand_path(file))) do
|
53
|
-
services.each do |name, options|
|
54
|
-
normalize_env_vars(options)
|
55
|
-
if options.has_key?('extends')
|
56
|
-
extension_file = options['extends']['file']
|
57
|
-
service_name = options['extends']['service']
|
58
|
-
options.delete('extends')
|
59
|
-
services[name] = extend_options(options, extension_file , service_name, prefix)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
if name.nil?
|
64
|
-
services
|
65
|
-
else
|
66
|
-
abort("Service #{name} not found in #{file}") unless services.has_key?(name)
|
67
|
-
services[name]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# @param [Hash] options
|
72
|
-
# @param [String] file
|
73
|
-
# @param [String] service_name
|
74
|
-
# @param [String] prefix
|
75
|
-
# @return [Hash]
|
76
|
-
def extend_options(options, file, service_name, prefix)
|
77
|
-
parent_options = parse_services(file, service_name, prefix)
|
78
|
-
options['environment'] = extend_env_vars(parent_options['environment'], options['environment'])
|
79
|
-
options['secrets'] = extend_secrets(parent_options['secrets'], options['secrets'])
|
80
|
-
parent_options.merge(options)
|
81
|
-
end
|
82
|
-
|
83
|
-
# @param [Hash] options
|
84
|
-
def normalize_env_vars(options)
|
85
|
-
if options['environment'].is_a?(Hash)
|
86
|
-
options['environment'] = options['environment'].map{|k, v| "#{k}=#{v}"}
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
# @param [Array] from
|
91
|
-
# @param [Array] to
|
92
|
-
# @return [Array]
|
93
|
-
def extend_env_vars(from, to)
|
94
|
-
env_vars = to || []
|
95
|
-
if from
|
96
|
-
from.each do |env|
|
97
|
-
env_vars << env unless to && to.find {|key| key.split('=').first == env.split('=').first}
|
98
|
-
end
|
99
|
-
end
|
100
|
-
env_vars
|
101
|
-
end
|
102
|
-
|
103
|
-
# @param [Array] from
|
104
|
-
# @param [Array] to
|
105
|
-
# @return [Array]
|
106
|
-
def extend_secrets(from, to)
|
107
|
-
secrets = to || []
|
108
|
-
if from
|
109
|
-
from.each do |from_secret|
|
110
|
-
secrets << from_secret unless to && to.any? {|to_secret| to_secret['secret'] == from_secret['secret']}
|
111
|
-
end
|
112
|
-
end
|
113
|
-
secrets
|
114
|
-
end
|
115
|
-
|
116
91
|
# @param [Hash] services
|
117
92
|
# @param [String] file
|
118
93
|
def create_yml(services, file = 'kontena.yml')
|
@@ -131,6 +106,37 @@ module Kontena::Cli::Apps
|
|
131
106
|
@app_json
|
132
107
|
end
|
133
108
|
|
109
|
+
def display_notifications(messages, color = :yellow)
|
110
|
+
messages.each do |files|
|
111
|
+
files.each do |file, services|
|
112
|
+
STDERR.puts "#{file}:".colorize(color)
|
113
|
+
services.each do |service|
|
114
|
+
service.each do |name, errors|
|
115
|
+
STDERR.puts " #{name}:".colorize(color)
|
116
|
+
if errors.is_a?(String)
|
117
|
+
STDERR.puts " - #{errors}".colorize(color)
|
118
|
+
else
|
119
|
+
errors.each do |key, error|
|
120
|
+
STDERR.puts " - #{key}: #{error.to_json}".colorize(color)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def hint_on_validation_notifications(errors)
|
130
|
+
STDERR.puts "YAML contains the following unsupported options and they were rejected:".colorize(:yellow)
|
131
|
+
display_notifications(errors)
|
132
|
+
end
|
133
|
+
|
134
|
+
def abort_on_validation_errors(errors)
|
135
|
+
STDERR.puts "YAML validation failed! Aborting.".colorize(:red)
|
136
|
+
display_notifications(errors, :red)
|
137
|
+
abort
|
138
|
+
end
|
139
|
+
|
134
140
|
def valid_addons(prefix=nil)
|
135
141
|
if prefix
|
136
142
|
prefix = "#{prefix}-"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
module Kontena::Cli::Apps
|
5
|
+
class ConfigCommand < Clamp::Command
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
include Kontena::Cli::GridOptions
|
8
|
+
include Common
|
9
|
+
|
10
|
+
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
11
|
+
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
12
|
+
|
13
|
+
parameter "[SERVICE] ...", "Services to view"
|
14
|
+
|
15
|
+
attr_reader :service_prefix
|
16
|
+
|
17
|
+
def execute
|
18
|
+
require_config_file(filename)
|
19
|
+
@service_prefix = project_name || current_dir
|
20
|
+
services = services_from_yaml(filename, service_list, service_prefix)
|
21
|
+
services.each do |name, config|
|
22
|
+
config['cmd'] = config['cmd'].join(" ") if config['cmd']
|
23
|
+
config.delete_if {|key, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
|
24
|
+
end
|
25
|
+
services = { 'services' => services }
|
26
|
+
puts services.to_yaml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -17,15 +17,14 @@ module Kontena::Cli::Apps
|
|
17
17
|
|
18
18
|
parameter "[SERVICE] ...", "Services to start"
|
19
19
|
|
20
|
-
attr_reader :services, :
|
20
|
+
attr_reader :services, :deploy_queue
|
21
21
|
|
22
22
|
def execute
|
23
23
|
require_api_url
|
24
24
|
require_token
|
25
25
|
require_config_file(filename)
|
26
|
-
@deploy_queue = []
|
27
|
-
@
|
28
|
-
@services = load_services(filename, service_list, service_prefix)
|
26
|
+
@deploy_queue = []
|
27
|
+
@services = services_from_yaml(filename, service_list, service_prefix)
|
29
28
|
process_docker_images(services) if !no_build?
|
30
29
|
create_or_update_services(services)
|
31
30
|
deploy_services(deploy_queue)
|
@@ -60,19 +59,19 @@ module Kontena::Cli::Apps
|
|
60
59
|
# @param [Hash] options
|
61
60
|
def create_or_update_service(name, options)
|
62
61
|
# skip if service is already processed or it's not present
|
63
|
-
return nil if in_deploy_queue?(name) || !services.
|
62
|
+
return nil if in_deploy_queue?(name) || !services.key?(name)
|
64
63
|
|
65
64
|
# create/update linked services recursively before continuing
|
66
|
-
unless options['links'].
|
67
|
-
|
65
|
+
unless options['links'].empty?
|
66
|
+
options['links'].each_with_index do |linked_service, index|
|
68
67
|
# change prefixed service name also to links options
|
69
|
-
|
70
|
-
|
68
|
+
linked_service_name = linked_service['name']
|
69
|
+
options['links'][index]['name'] = "#{prefixed_name(linked_service['name'])}"
|
70
|
+
create_or_update_service(linked_service_name, services[linked_service_name]) unless in_deploy_queue?(linked_service_name)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
merge_external_links(options)
|
75
|
-
merge_env_vars(options)
|
76
75
|
|
77
76
|
if service_exists?(name)
|
78
77
|
service = update(name, options)
|
@@ -93,8 +92,8 @@ module Kontena::Cli::Apps
|
|
93
92
|
def create(name, options)
|
94
93
|
puts "creating #{name.colorize(:cyan)}"
|
95
94
|
name = prefixed_name(name)
|
96
|
-
data = {name
|
97
|
-
data.merge!(
|
95
|
+
data = { 'name' => name }
|
96
|
+
data.merge!(options)
|
98
97
|
create_service(token, current_grid, data)
|
99
98
|
end
|
100
99
|
|
@@ -103,8 +102,7 @@ module Kontena::Cli::Apps
|
|
103
102
|
def update(id, options)
|
104
103
|
puts "updating #{id.colorize(:cyan)}"
|
105
104
|
id = prefixed_name(id)
|
106
|
-
|
107
|
-
update_service(token, id, data)
|
105
|
+
update_service(token, id, options)
|
108
106
|
end
|
109
107
|
|
110
108
|
# @param [String] name
|
@@ -122,20 +120,6 @@ module Kontena::Cli::Apps
|
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
125
|
-
# @param [Hash] options
|
126
|
-
def merge_env_vars(options)
|
127
|
-
return unless options['env_file']
|
128
|
-
|
129
|
-
options['env_file'] = [options['env_file']] if options['env_file'].is_a?(String)
|
130
|
-
options['environment'] = [] unless options['environment']
|
131
|
-
|
132
|
-
options['env_file'].each do |env_file|
|
133
|
-
options['environment'].concat(read_env_file(env_file))
|
134
|
-
end
|
135
|
-
|
136
|
-
options['environment'].uniq! {|s| s.split('=').first}
|
137
|
-
end
|
138
|
-
|
139
123
|
# @param [Hash] options
|
140
124
|
def merge_external_links(options)
|
141
125
|
if options['external_links']
|
@@ -144,58 +128,5 @@ module Kontena::Cli::Apps
|
|
144
128
|
options.delete('external_links')
|
145
129
|
end
|
146
130
|
end
|
147
|
-
|
148
|
-
# @param [String] path
|
149
|
-
def read_env_file(path)
|
150
|
-
File.readlines(path).delete_if { |line| line.start_with?('#') || line.empty? }
|
151
|
-
end
|
152
|
-
|
153
|
-
##
|
154
|
-
# @param [Hash] options
|
155
|
-
def parse_data(options)
|
156
|
-
data = {}
|
157
|
-
data[:image] = parse_image(options['image'])
|
158
|
-
data[:env] = options['environment']
|
159
|
-
data[:container_count] = options['instances']
|
160
|
-
data[:links] = parse_links(options['links'] || [])
|
161
|
-
data[:ports] = parse_ports(options['ports'] || [])
|
162
|
-
data[:memory] = parse_memory(options['mem_limit'].to_s) if options['mem_limit']
|
163
|
-
data[:memory_swap] = parse_memory(options['memswap_limit'].to_s) if options['memswap_limit']
|
164
|
-
data[:cpu_shares] = options['cpu_shares'] if options['cpu_shares']
|
165
|
-
data[:volumes] = options['volumes'] || []
|
166
|
-
data[:volumes_from] = options['volumes_from'] || []
|
167
|
-
data[:cmd] = options['command'].split(" ") if options['command']
|
168
|
-
data[:affinity] = options['affinity'] || []
|
169
|
-
data[:user] = options['user'] if options['user']
|
170
|
-
data[:stateful] = options['stateful'] == true
|
171
|
-
data[:privileged] = options['privileged'] unless options['privileged'].nil?
|
172
|
-
data[:cap_add] = options['cap_add'] if options['cap_add']
|
173
|
-
data[:cap_drop] = options['cap_drop'] if options['cap_drop']
|
174
|
-
data[:net] = options['net'] if options['net']
|
175
|
-
data[:pid] = options['pid'] if options['pid']
|
176
|
-
data[:log_driver] = options['log_driver'] if options['log_driver']
|
177
|
-
data[:log_opts] = options['log_opt'] if options['log_opt'] && !options['log_opt'].empty?
|
178
|
-
|
179
|
-
deploy_opts = options['deploy'] || {}
|
180
|
-
data[:strategy] = deploy_opts['strategy'] if deploy_opts['strategy']
|
181
|
-
deploy = {}
|
182
|
-
if deploy_opts.has_key?('wait_for_port')
|
183
|
-
deploy[:wait_for_port] = deploy_opts['wait_for_port']
|
184
|
-
end
|
185
|
-
if deploy_opts.has_key?('min_health')
|
186
|
-
deploy[:min_health] = deploy_opts['min_health']
|
187
|
-
end
|
188
|
-
if deploy_opts.has_key?('interval')
|
189
|
-
deploy[:interval] = parse_relative_time(deploy_opts['interval'])
|
190
|
-
end
|
191
|
-
unless deploy.empty?
|
192
|
-
data[:deploy_opts] = deploy
|
193
|
-
end
|
194
|
-
|
195
|
-
data[:hooks] = options['hooks'] || {}
|
196
|
-
data[:secrets] = options['secrets'] if options['secrets']
|
197
|
-
|
198
|
-
data
|
199
|
-
end
|
200
131
|
end
|
201
132
|
end
|
@@ -12,15 +12,15 @@ module Kontena::Cli::Apps
|
|
12
12
|
|
13
13
|
services.each do |name, service|
|
14
14
|
if service['build'] && (!image_exist?(service['image']) || force_build)
|
15
|
-
dockerfile = service['dockerfile'] || 'Dockerfile'
|
15
|
+
dockerfile = service['build']['dockerfile'] || 'Dockerfile'
|
16
16
|
abort("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
|
17
|
-
abort("'#{service['build']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build'], dockerfile)
|
17
|
+
abort("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
|
18
18
|
if service['hooks'] && service['hooks']['pre_build']
|
19
19
|
puts "Running pre_build hook".colorize(:cyan)
|
20
20
|
run_pre_build_hook(service['hooks']['pre_build'])
|
21
21
|
end
|
22
22
|
puts "Building image #{service['image'].colorize(:cyan)}"
|
23
|
-
build_docker_image(service['image'], service['build'], dockerfile, no_cache)
|
23
|
+
build_docker_image(service['image'], service['build']['context'], dockerfile, no_cache)
|
24
24
|
puts "Pushing image #{service['image'].colorize(:cyan)} to registry"
|
25
25
|
push_docker_image(service['image'])
|
26
26
|
end
|
@@ -15,13 +15,10 @@ module Kontena::Cli::Apps
|
|
15
15
|
option ["-b", "--base-image"], "BASE_IMAGE_NAME", "Specify a docker base image name", default: "kontena/buildstep"
|
16
16
|
option ["-p", "--project-name"], "NAME", "Specify an alternate project name (default: directory name)"
|
17
17
|
|
18
|
-
attr_reader :service_prefix
|
19
18
|
|
20
19
|
def execute
|
21
20
|
require 'highline/import'
|
22
21
|
|
23
|
-
@service_prefix = project_name || File.basename(Dir.getwd)
|
24
|
-
|
25
22
|
if File.exist?('Dockerfile')
|
26
23
|
puts 'Found Dockerfile'
|
27
24
|
elsif create_dockerfile?
|
@@ -11,13 +11,12 @@ module Kontena::Cli::Apps
|
|
11
11
|
|
12
12
|
parameter "[SERVICE] ...", "Services to start"
|
13
13
|
|
14
|
-
attr_reader :services
|
14
|
+
attr_reader :services
|
15
15
|
|
16
16
|
def execute
|
17
17
|
require_config_file(filename)
|
18
18
|
|
19
|
-
@
|
20
|
-
@services = load_services(filename, service_list, service_prefix)
|
19
|
+
@services = services_from_yaml(filename, service_list, service_prefix)
|
21
20
|
if services.size > 0
|
22
21
|
show_services(services)
|
23
22
|
elsif !service_list.empty?
|