kontena-cli 0.9.1 → 0.9.2
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/bin/kontena +0 -1
- data/lib/kontena/cli/apps/build_command.rb +2 -4
- data/lib/kontena/cli/apps/common.rb +11 -16
- data/lib/kontena/cli/apps/deploy_command.rb +1 -3
- data/lib/kontena/cli/apps/docker_compose_generator.rb +4 -1
- data/lib/kontena/cli/apps/docker_helper.rb +13 -3
- data/lib/kontena/cli/apps/dockerfile_generator.rb +1 -2
- data/lib/kontena/cli/apps/init_command.rb +1 -6
- data/lib/kontena/cli/master/vagrant/start_command.rb +2 -2
- data/lib/kontena/cli/vpn/config_command.rb +12 -0
- data/lib/kontena/cli/vpn/create_command.rb +16 -4
- data/lib/kontena/machine/aws/cloudinit.yml +2 -2
- data/lib/kontena/machine/azure/cloudinit.yml +2 -2
- data/lib/kontena/machine/digital_ocean/cloudinit.yml +2 -2
- data/lib/kontena/machine/vagrant/cloudinit.yml +2 -2
- data/spec/kontena/cli/app/deploy_command_spec.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6f13af1e4ef1baba9a25c485fcdf2eed975896e
|
4
|
+
data.tar.gz: 379ce85400a3c12551fba0d4308b1a58c0b9e6cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17b1db66fd0e64336ed40bac883691760ccfd96a336ba904626cc5973dcff8154aa231899d44335376a4e427620024e32b4a56b9f76ec1818d67ce992bf1818c
|
7
|
+
data.tar.gz: b272375202893d439b306367bef26372aa26433fa1e947daa3cf0f6470a05671f03fd1735dbc5397fb38daa7c7a960c7cffae7ccb34ed2a09477bf62aea6f763
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.2
|
data/bin/kontena
CHANGED
@@ -37,7 +37,6 @@ require 'kontena/cli/version_command'
|
|
37
37
|
|
38
38
|
class MainCommand < Clamp::Command
|
39
39
|
|
40
|
-
subcommand "app", "Grid specific commands", Kontena::Cli::AppCommand
|
41
40
|
subcommand "grid", "Grid specific commands", Kontena::Cli::GridCommand
|
42
41
|
subcommand "app", "App specific commands", Kontena::Cli::AppCommand
|
43
42
|
subcommand "service", "Service specific commands", Kontena::Cli::ServiceCommand
|
@@ -17,10 +17,8 @@ module Kontena::Cli::Apps
|
|
17
17
|
def execute
|
18
18
|
require_config_file(filename)
|
19
19
|
@service_prefix = project_name || current_dir
|
20
|
-
dir = Dir.getwd
|
21
20
|
@services = load_services(filename, service_list, service_prefix)
|
22
|
-
|
23
|
-
process_docker_images(services, true) if dockerfile_exist?
|
21
|
+
process_docker_images(services, true)
|
24
22
|
end
|
25
23
|
end
|
26
|
-
end
|
24
|
+
end
|
@@ -34,14 +34,15 @@ module Kontena::Cli::Apps
|
|
34
34
|
|
35
35
|
def parse_services(file, name = nil, prefix='')
|
36
36
|
services = YAML.load(File.read(File.expand_path(file)) % {project: prefix})
|
37
|
-
Dir.chdir(File.dirname(File.expand_path(file)))
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
Dir.chdir(File.dirname(File.expand_path(file))) do
|
38
|
+
services.each do |name, options|
|
39
|
+
normalize_env_vars(options)
|
40
|
+
if options.has_key?('extends')
|
41
|
+
extension_file = options['extends']['file']
|
42
|
+
service_name = options['extends']['service']
|
43
|
+
options.delete('extends')
|
44
|
+
services[name] = extend_options(options, extension_file , service_name, prefix)
|
45
|
+
end
|
45
46
|
end
|
46
47
|
end
|
47
48
|
if name.nil?
|
@@ -73,14 +74,6 @@ module Kontena::Cli::Apps
|
|
73
74
|
env_vars
|
74
75
|
end
|
75
76
|
|
76
|
-
def dockerfile_exist?
|
77
|
-
!dockerfile.nil?
|
78
|
-
end
|
79
|
-
|
80
|
-
def dockerfile
|
81
|
-
@dockerfile ||= File.new('Dockerfile') rescue nil
|
82
|
-
end
|
83
|
-
|
84
77
|
def create_yml(services, file='kontena.yml')
|
85
78
|
yml = File.new(file, 'w')
|
86
79
|
yml.puts services.to_yaml
|
@@ -90,6 +83,8 @@ module Kontena::Cli::Apps
|
|
90
83
|
def app_json
|
91
84
|
if !@app_json && File.exist?('app.json')
|
92
85
|
@app_json = JSON.parse(File.read('app.json'))
|
86
|
+
else
|
87
|
+
@app_json = {}
|
93
88
|
end
|
94
89
|
@app_json
|
95
90
|
end
|
@@ -20,12 +20,10 @@ module Kontena::Cli::Apps
|
|
20
20
|
require_api_url
|
21
21
|
require_token
|
22
22
|
require_config_file(filename)
|
23
|
-
dir = Dir.getwd
|
24
23
|
@deploy_queue = []
|
25
24
|
@service_prefix = project_name || current_dir
|
26
25
|
@services = load_services(filename, service_list, service_prefix)
|
27
|
-
|
28
|
-
process_docker_images(services) if !no_build? && dockerfile_exist?
|
26
|
+
process_docker_images(services) if !no_build?
|
29
27
|
create_or_update_services(services)
|
30
28
|
deploy_services(deploy_queue)
|
31
29
|
end
|
@@ -17,7 +17,10 @@ module Kontena::Cli::Apps
|
|
17
17
|
docker_compose = {}
|
18
18
|
procfile.keys.each do |service|
|
19
19
|
docker_compose[service] = {'build' => '.' }
|
20
|
-
|
20
|
+
if app_json && service == 'web' # Heroku generates PORT env variable so should we do too
|
21
|
+
docker_compose[service]['environment'] = ['PORT=5000']
|
22
|
+
docker_compose[service]['ports'] = ['5000:5000']
|
23
|
+
end
|
21
24
|
docker_compose[service]['command'] = "/start #{service}" if service != 'web'
|
22
25
|
docker_compose[service]['env_file'] = env_file if env_file
|
23
26
|
|
@@ -5,6 +5,7 @@ module Kontena::Cli::Apps
|
|
5
5
|
services.each do |name, service|
|
6
6
|
if service['build'] && (!image_exist?(service['image']) || force_build)
|
7
7
|
abort("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
|
8
|
+
abort("'#{service['build']}' does not have Dockerfile") unless dockerfile_exist?(service['build'])
|
8
9
|
puts "Building image #{service['image'].colorize(:cyan)}"
|
9
10
|
build_docker_image(service['image'], service['build'])
|
10
11
|
|
@@ -20,15 +21,24 @@ module Kontena::Cli::Apps
|
|
20
21
|
|
21
22
|
|
22
23
|
def build_docker_image(name, path)
|
23
|
-
system("docker build -t #{name} #{path}")
|
24
|
+
ret = system("docker build -t #{name} #{path}")
|
25
|
+
abort("Failed to build image #{name.colorize(:cyan)}") unless ret
|
26
|
+
ret
|
24
27
|
end
|
25
28
|
|
26
29
|
def push_docker_image(image)
|
27
|
-
system("docker push #{image}")
|
30
|
+
ret = system("docker push #{image}")
|
31
|
+
abort("Failed to push image #{image.colorize(:cyan)}") unless ret
|
32
|
+
ret
|
28
33
|
end
|
29
34
|
|
30
35
|
def image_exist?(image)
|
31
36
|
`docker history #{image} 2>&1` ; $?.success?
|
32
37
|
end
|
38
|
+
|
39
|
+
def dockerfile_exist?(path)
|
40
|
+
file = File.join(File.expand_path(path), 'Dockerfile')
|
41
|
+
File.exist?(file)
|
42
|
+
end
|
33
43
|
end
|
34
|
-
end
|
44
|
+
end
|
@@ -5,11 +5,10 @@ module Kontena::Cli::Apps
|
|
5
5
|
class DockerfileGenerator
|
6
6
|
include Common
|
7
7
|
|
8
|
-
def generate(base_image
|
8
|
+
def generate(base_image)
|
9
9
|
|
10
10
|
dockerfile = File.new('Dockerfile', 'w')
|
11
11
|
dockerfile.puts "FROM #{base_image}"
|
12
|
-
dockerfile.puts "MAINTAINER #{maintainer}"
|
13
12
|
dockerfile.puts 'CMD ["/start", "web"]'
|
14
13
|
dockerfile.close
|
15
14
|
end
|
@@ -27,7 +27,7 @@ module Kontena::Cli::Apps
|
|
27
27
|
puts 'Found Dockerfile'
|
28
28
|
elsif create_dockerfile?
|
29
29
|
puts "Creating #{'Dockerfile'.colorize(:cyan)}"
|
30
|
-
DockerfileGenerator.new.generate(base_image
|
30
|
+
DockerfileGenerator.new.generate(base_image)
|
31
31
|
end
|
32
32
|
|
33
33
|
if File.exist?('Procfile')
|
@@ -88,11 +88,6 @@ module Kontena::Cli::Apps
|
|
88
88
|
nil
|
89
89
|
end
|
90
90
|
|
91
|
-
def current_user
|
92
|
-
token = require_token
|
93
|
-
client(token).get('user') rescue ''
|
94
|
-
end
|
95
|
-
|
96
91
|
def create_docker_compose_yml?
|
97
92
|
['', 'y', 'yes'].include? ask("#{docker_compose_file} not found. Do you want to create it? [Yn]: ").downcase
|
98
93
|
end
|
@@ -5,9 +5,9 @@ module Kontena::Cli::Master::Vagrant
|
|
5
5
|
def execute
|
6
6
|
require 'kontena/machine/vagrant'
|
7
7
|
vagrant_path = "#{Dir.home}/.kontena/vagrant_master"
|
8
|
-
abort("Cannot find Vagrant node
|
8
|
+
abort("Cannot find Vagrant node kontena-master".colorize(:red)) unless Dir.exist?(vagrant_path)
|
9
9
|
Dir.chdir(vagrant_path) do
|
10
|
-
ShellSpinner "Starting Vagrant machine
|
10
|
+
ShellSpinner "Starting Vagrant machine kontena-master " do
|
11
11
|
Open3.popen2('vagrant up') do |stdin, output, wait|
|
12
12
|
while o = output.gets
|
13
13
|
print o if ENV['DEBUG']
|
@@ -3,10 +3,22 @@ module Kontena::Cli::Vpn
|
|
3
3
|
include Kontena::Cli::Common
|
4
4
|
|
5
5
|
def execute
|
6
|
+
require 'rbconfig'
|
6
7
|
require_api_url
|
7
8
|
payload = {cmd: ['/usr/local/bin/ovpn_getclient', 'KONTENA_VPN_CLIENT']}
|
8
9
|
stdout, stderr = client(require_token).post("containers/#{current_grid}/vpn/vpn-1/exec", payload)
|
10
|
+
if linux?
|
11
|
+
stdout << "\n"
|
12
|
+
stdout << "up /etc/openvpn/update-resolv-conf\n"
|
13
|
+
stdout << "down /etc/openvpn/update-resolv-conf\n"
|
14
|
+
end
|
9
15
|
puts stdout
|
10
16
|
end
|
17
|
+
|
18
|
+
# @return [Boolean]
|
19
|
+
def linux?
|
20
|
+
host_os = RbConfig::CONFIG['host_os']
|
21
|
+
host_os.include?('linux')
|
22
|
+
end
|
11
23
|
end
|
12
24
|
end
|
@@ -22,8 +22,7 @@ module Kontena::Cli::Vpn
|
|
22
22
|
abort('Node not found') if node.nil?
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
vpn_ip = node_vpn_ip(node)
|
27
26
|
data = {
|
28
27
|
name: 'vpn',
|
29
28
|
stateful: true,
|
@@ -36,7 +35,7 @@ module Kontena::Cli::Vpn
|
|
36
35
|
}
|
37
36
|
],
|
38
37
|
cap_add: ['NET_ADMIN'],
|
39
|
-
env: ["OVPN_SERVER_URL=udp://#{
|
38
|
+
env: ["OVPN_SERVER_URL=udp://#{vpn_ip}:1194"],
|
40
39
|
affinity: ["node==#{node['name']}"]
|
41
40
|
}
|
42
41
|
client(token).post("grids/#{current_grid}/services", data)
|
@@ -47,8 +46,21 @@ module Kontena::Cli::Vpn
|
|
47
46
|
sleep 1
|
48
47
|
end
|
49
48
|
puts ' done'
|
50
|
-
puts "OpenVPN service is now started (udp://#{
|
49
|
+
puts "OpenVPN service is now started (udp://#{vpn_ip}:1194)."
|
51
50
|
puts "Use 'kontena vpn config' to fetch OpenVPN client config to your machine (it takes a while until config is ready)."
|
52
51
|
end
|
52
|
+
|
53
|
+
# @param [Hash] node
|
54
|
+
# @return [String]
|
55
|
+
def node_vpn_ip(node)
|
56
|
+
ip unless ip.nil?
|
57
|
+
|
58
|
+
# vagrant
|
59
|
+
if api_url == 'http://192.168.66.100:8080'
|
60
|
+
node['private_ip']
|
61
|
+
else
|
62
|
+
node['public_ip']
|
63
|
+
end
|
64
|
+
end
|
53
65
|
end
|
54
66
|
end
|
@@ -12,7 +12,7 @@ write_files:
|
|
12
12
|
- path: /etc/systemd/system/docker.service.d/50-kontena.conf
|
13
13
|
content: |
|
14
14
|
[Service]
|
15
|
-
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.
|
15
|
+
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
|
16
16
|
coreos:
|
17
17
|
units:
|
18
18
|
- name: 00-eth.network
|
@@ -22,7 +22,7 @@ coreos:
|
|
22
22
|
Name=eth*
|
23
23
|
[Network]
|
24
24
|
DHCP=yes
|
25
|
-
DNS=172.17.
|
25
|
+
DNS=172.17.43.1
|
26
26
|
DNS=<%= dns_server %>
|
27
27
|
DOMAINS=kontena.local
|
28
28
|
[DHCP]
|
@@ -11,12 +11,12 @@ write_files:
|
|
11
11
|
- path: /etc/systemd/system/docker.service.d/50-kontena.conf
|
12
12
|
content: |
|
13
13
|
[Service]
|
14
|
-
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.
|
14
|
+
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
|
15
15
|
- path: /etc/resolv.conf
|
16
16
|
permissions: 0644
|
17
17
|
owner: root
|
18
18
|
content: |
|
19
|
-
nameserver 172.17.
|
19
|
+
nameserver 172.17.43.1
|
20
20
|
nameserver 8.8.8.8
|
21
21
|
nameserver 8.8.4.4
|
22
22
|
coreos:
|
@@ -11,12 +11,12 @@ write_files:
|
|
11
11
|
- path: /etc/systemd/system/docker.service.d/50-kontena.conf
|
12
12
|
content: |
|
13
13
|
[Service]
|
14
|
-
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.
|
14
|
+
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
|
15
15
|
- path: /etc/resolv.conf
|
16
16
|
permissions: 0644
|
17
17
|
owner: root
|
18
18
|
content: |
|
19
|
-
nameserver 172.17.
|
19
|
+
nameserver 172.17.43.1
|
20
20
|
nameserver 8.8.8.8
|
21
21
|
nameserver 8.8.4.4
|
22
22
|
coreos:
|
@@ -11,7 +11,7 @@ write_files:
|
|
11
11
|
- path: /etc/systemd/system/docker.service.d/50-kontena.conf
|
12
12
|
content: |
|
13
13
|
[Service]
|
14
|
-
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.
|
14
|
+
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
|
15
15
|
coreos:
|
16
16
|
units:
|
17
17
|
- name: 00-eth.network
|
@@ -21,7 +21,7 @@ coreos:
|
|
21
21
|
Name=eth*
|
22
22
|
[Network]
|
23
23
|
DHCP=yes
|
24
|
-
DNS=172.17.
|
24
|
+
DNS=172.17.43.1
|
25
25
|
DNS=172.28.128.1
|
26
26
|
DNS=8.8.8.8
|
27
27
|
DOMAINS=kontena.local
|
@@ -126,7 +126,6 @@ yml
|
|
126
126
|
|
127
127
|
it 'uses current directory as service name prefix by default' do
|
128
128
|
current_dir = '/kontena/tests/stacks'
|
129
|
-
allow(Dir).to receive(:chdir).and_return(true)
|
130
129
|
allow(Dir).to receive(:getwd).and_return(current_dir)
|
131
130
|
expect(File).to receive(:basename).with(current_dir).and_return('stacks')
|
132
131
|
subject.run([])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|