kontena-cli 0.13.4 → 0.14.0
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/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?
|