percheron 0.6.4 → 0.7.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/.cane +4 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +31 -0
- data/.travis.yml +4 -1
- data/Guardfile +3 -3
- data/README.md +19 -3
- data/Rakefile +24 -1
- data/bin/percheron +2 -20
- data/lib/percheron/actions/base.rb +0 -39
- data/lib/percheron/actions/build.rb +9 -7
- data/lib/percheron/actions/create.rb +64 -38
- data/lib/percheron/actions/exec.rb +40 -8
- data/lib/percheron/actions/exec_local.rb +4 -4
- data/lib/percheron/actions/logs.rb +44 -0
- data/lib/percheron/actions/purge.rb +15 -4
- data/lib/percheron/actions/recreate.rb +15 -65
- data/lib/percheron/actions/restart.rb +2 -1
- data/lib/percheron/actions/shell.rb +27 -0
- data/lib/percheron/actions/start.rb +10 -7
- data/lib/percheron/actions.rb +2 -1
- data/lib/percheron/commands/abstract.rb +20 -8
- data/lib/percheron/commands/build.rb +13 -0
- data/lib/percheron/commands/console.rb +53 -0
- data/lib/percheron/commands/create.rb +3 -3
- data/lib/percheron/commands/list.rb +7 -3
- data/lib/percheron/commands/logs.rb +16 -0
- data/lib/percheron/commands/main.rb +5 -2
- data/lib/percheron/commands/purge.rb +2 -2
- data/lib/percheron/commands/recreate.rb +3 -11
- data/lib/percheron/commands/restart.rb +2 -2
- data/lib/percheron/commands/shell.rb +16 -0
- data/lib/percheron/commands/start.rb +2 -2
- data/lib/percheron/commands/stop.rb +2 -2
- data/lib/percheron/commands.rb +3 -0
- data/lib/percheron/config.rb +64 -3
- data/lib/percheron/config_delegator.rb +0 -1
- data/lib/percheron/container.rb +95 -38
- data/lib/percheron/core_extensions.rb +1 -4
- data/lib/percheron/docker_connection.rb +5 -1
- data/lib/percheron/formatters/stack/table.rb +24 -12
- data/lib/percheron/logger.rb +21 -0
- data/lib/percheron/metastore.rb +1 -0
- data/lib/percheron/null_stack.rb +5 -0
- data/lib/percheron/oh_dear.rb +15 -7
- data/lib/percheron/stack.rb +77 -72
- data/lib/percheron/validators/config.rb +1 -1
- data/lib/percheron/validators/container.rb +31 -11
- data/lib/percheron/validators/stack.rb +3 -5
- data/lib/percheron/version.rb +1 -1
- data/lib/percheron.rb +2 -0
- data/percheron.gemspec +4 -1
- metadata +54 -4
- data/assets/percheron.png +0 -0
- data/lib/percheron/actions/rename.rb +0 -65
@@ -4,94 +4,44 @@ module Percheron
|
|
4
4
|
|
5
5
|
include Base
|
6
6
|
|
7
|
-
def initialize(container,
|
7
|
+
def initialize(container, start: false)
|
8
8
|
@container = container
|
9
|
-
@
|
10
|
-
@delete = delete
|
9
|
+
@start = start
|
11
10
|
end
|
12
11
|
|
13
12
|
def execute!
|
14
13
|
results = []
|
15
14
|
if recreate?
|
16
15
|
results << recreate!
|
16
|
+
results << start!
|
17
17
|
else
|
18
|
-
|
19
|
-
$logger.warn "Container '#{container.name}' MD5's do not match, consider recreating (bump the version!)"
|
20
|
-
else
|
21
|
-
$logger.info "Container '#{container.name}' does not need to be recreated"
|
22
|
-
end
|
18
|
+
inform!
|
23
19
|
end
|
24
20
|
results.compact.empty? ? nil : container
|
25
21
|
end
|
26
22
|
|
27
23
|
private
|
28
24
|
|
29
|
-
attr_reader :container, :
|
30
|
-
|
31
|
-
alias_method :force_recreate?, :force_recreate
|
32
|
-
alias_method :delete?, :delete
|
33
|
-
|
34
|
-
def temporary_name
|
35
|
-
'%s_wip' % container.name
|
36
|
-
end
|
37
|
-
|
38
|
-
def stored_dockerfile_md5
|
39
|
-
container.dockerfile_md5 || container.current_dockerfile_md5
|
40
|
-
end
|
41
|
-
|
42
|
-
def temporary_container_exists?
|
43
|
-
!!Docker::Container.get(temporary_name)
|
44
|
-
rescue Docker::Error::NotFoundError
|
45
|
-
false
|
46
|
-
end
|
25
|
+
attr_reader :container, :start
|
26
|
+
alias_method :start?, :start
|
47
27
|
|
48
28
|
def recreate?
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def versions_mismatch?
|
53
|
-
container.version > container.built_version
|
29
|
+
!container.versions_match? || !container.dockerfile_md5s_match?
|
54
30
|
end
|
55
31
|
|
56
|
-
def
|
57
|
-
|
32
|
+
def inform!
|
33
|
+
return nil unless container.dockerfile_md5s_match?
|
34
|
+
$logger.info "Container '#{container.name}' - No Dockerfile changes or version bump"
|
58
35
|
end
|
59
36
|
|
60
37
|
def recreate!
|
61
|
-
$logger.debug "Container '#{container.name}' exists
|
62
|
-
|
63
|
-
|
64
|
-
delete_container_and_image! if delete?
|
65
|
-
create_container!
|
66
|
-
rename_container!
|
67
|
-
else
|
68
|
-
$logger.debug "Not recreating '#{container.name}' container because temporary container '#{temporary_name}' already exists"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def delete_container_and_image!
|
73
|
-
delete_container!
|
74
|
-
delete_image!
|
75
|
-
end
|
76
|
-
|
77
|
-
def delete_container!
|
78
|
-
$logger.info "Deleting '#{container.name}' container"
|
79
|
-
stop_containers!([ container ])
|
80
|
-
container.docker_container.remove
|
81
|
-
end
|
82
|
-
|
83
|
-
def delete_image!
|
84
|
-
$logger.info "Deleting '#{container.name}' image"
|
85
|
-
container.image.remove
|
86
|
-
end
|
87
|
-
|
88
|
-
def create_container!
|
89
|
-
opts = { create: { 'name' => temporary_name } }
|
90
|
-
Create.new(container, recreate: true).execute!(opts)
|
38
|
+
$logger.debug "Container '#{container.name}' exists but will be recreated"
|
39
|
+
Purge.new(container).execute!
|
40
|
+
Create.new(container).execute!
|
91
41
|
end
|
92
42
|
|
93
|
-
def
|
94
|
-
|
43
|
+
def start!
|
44
|
+
Start.new(container).execute! if start?
|
95
45
|
end
|
96
46
|
|
97
47
|
end
|
@@ -24,7 +24,8 @@ module Percheron
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def start!
|
27
|
-
|
27
|
+
opts = { dependant_containers: container.startable_dependant_containers.values }
|
28
|
+
Start.new(container, opts).execute!
|
28
29
|
end
|
29
30
|
|
30
31
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Percheron
|
2
|
+
module Actions
|
3
|
+
class Shell
|
4
|
+
include Base
|
5
|
+
|
6
|
+
DEFAULT_SHELL = '/bin/sh'
|
7
|
+
|
8
|
+
def initialize(container, shell: DEFAULT_SHELL)
|
9
|
+
@container = container
|
10
|
+
@shell = shell
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute!
|
14
|
+
$logger.debug "Executing a bash shell on '#{container.name}' container"
|
15
|
+
exec!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :container, :shell
|
21
|
+
|
22
|
+
def exec!
|
23
|
+
system('docker exec -ti %s %s' % [ container.full_name, shell ])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -4,42 +4,45 @@ module Percheron
|
|
4
4
|
|
5
5
|
include Base
|
6
6
|
|
7
|
-
def initialize(container, dependant_containers: [], exec_scripts: true)
|
7
|
+
def initialize(container, dependant_containers: [], cmd: false, exec_scripts: true)
|
8
8
|
@container = container
|
9
9
|
@dependant_containers = dependant_containers
|
10
|
+
@cmd = cmd
|
10
11
|
@exec_scripts = exec_scripts
|
11
12
|
end
|
12
13
|
|
13
14
|
def execute!
|
14
15
|
results = []
|
15
|
-
results << create!
|
16
|
+
results << create!
|
16
17
|
unless container.running?
|
17
18
|
results << start!
|
18
|
-
results << execute_post_start_scripts!
|
19
|
+
results << execute_post_start_scripts!
|
19
20
|
end
|
20
21
|
results.compact.empty? ? nil : container
|
21
22
|
end
|
22
23
|
|
23
24
|
private
|
24
25
|
|
25
|
-
attr_reader :container, :dependant_containers, :exec_scripts
|
26
|
+
attr_reader :container, :dependant_containers, :cmd, :exec_scripts
|
26
27
|
|
27
28
|
def exec_scripts?
|
28
29
|
!container.post_start_scripts.empty? && exec_scripts
|
29
30
|
end
|
30
31
|
|
31
32
|
def create!
|
32
|
-
|
33
|
-
Create.new(container).execute!
|
33
|
+
return nil if container.exists?
|
34
|
+
Create.new(container, cmd: cmd, exec_scripts: exec_scripts).execute!
|
34
35
|
end
|
35
36
|
|
36
37
|
def start!
|
38
|
+
return nil if !container.startable? || container.running?
|
37
39
|
$logger.info "Starting '#{container.name}' container"
|
38
40
|
container.docker_container.start!
|
39
41
|
end
|
40
42
|
|
41
43
|
def execute_post_start_scripts!
|
42
|
-
|
44
|
+
scripts = container.post_start_scripts
|
45
|
+
Exec.new(container, dependant_containers, scripts, 'POST start').execute! if exec_scripts?
|
43
46
|
end
|
44
47
|
|
45
48
|
end
|
data/lib/percheron/actions.rb
CHANGED
@@ -4,11 +4,12 @@ require 'percheron/actions/start'
|
|
4
4
|
require 'percheron/actions/restart'
|
5
5
|
require 'percheron/actions/create'
|
6
6
|
require 'percheron/actions/recreate'
|
7
|
-
require 'percheron/actions/rename'
|
8
7
|
require 'percheron/actions/build'
|
9
8
|
require 'percheron/actions/purge'
|
10
9
|
require 'percheron/actions/exec'
|
11
10
|
require 'percheron/actions/exec_local'
|
11
|
+
require 'percheron/actions/shell'
|
12
|
+
require 'percheron/actions/logs'
|
12
13
|
|
13
14
|
module Percheron
|
14
15
|
module Actions
|
@@ -2,32 +2,44 @@ module Percheron
|
|
2
2
|
module Commands
|
3
3
|
class Abstract < Clamp::Command
|
4
4
|
|
5
|
-
|
5
|
+
option([ '-c', '--config_file' ], 'CONFIG', 'Config file',
|
6
|
+
default: Config::DEFAULT_CONFIG_FILE)
|
6
7
|
|
7
|
-
option
|
8
|
-
|
9
|
-
option '--version', :flag, 'show version' do
|
8
|
+
option('--version', :flag, 'show version') do
|
10
9
|
puts Percheron::VERSION
|
11
10
|
exit(0)
|
12
11
|
end
|
13
12
|
|
14
13
|
def self.default_parameters!
|
15
|
-
parameter('STACK_NAME', 'stack name', required:
|
16
|
-
parameter('CONTAINER_NAMES', 'container names',
|
14
|
+
parameter('STACK_NAME', 'stack name', required: true)
|
15
|
+
parameter('CONTAINER_NAMES', 'container names', default: [],
|
16
|
+
required: false) do |container_names|
|
17
17
|
container_names.split(/,/)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def self.default_create_parameters!
|
22
|
+
default_parameters!
|
23
|
+
option('--start', :flag, 'Start container', default: false)
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
stack.valid?
|
28
|
+
rescue => e
|
29
|
+
signal_usage_error(e.message)
|
30
|
+
end
|
31
|
+
|
21
32
|
def stack
|
33
|
+
return NullStack.new if stack_name.nil?
|
22
34
|
Percheron::Stack.new(config, stack_name)
|
23
35
|
end
|
24
36
|
|
25
37
|
def default_config_file
|
26
|
-
ENV.fetch('PERCHERON_CONFIG', DEFAULT_CONFIG_FILE)
|
38
|
+
ENV.fetch('PERCHERON_CONFIG', Config::DEFAULT_CONFIG_FILE)
|
27
39
|
end
|
28
40
|
|
29
41
|
def config
|
30
|
-
@config ||= Percheron::Config.
|
42
|
+
@config ||= Percheron::Config.load!(config_file)
|
31
43
|
rescue Errors::ConfigFileInvalid => e
|
32
44
|
$logger.error e.message
|
33
45
|
exit(1)
|
@@ -2,9 +2,62 @@ module Percheron
|
|
2
2
|
module Commands
|
3
3
|
class Console < Abstract
|
4
4
|
|
5
|
+
parameter('STACK_NAME', 'stack name', required: false)
|
6
|
+
|
5
7
|
def execute
|
8
|
+
super
|
9
|
+
require 'pry-byebug'
|
6
10
|
pry
|
7
11
|
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def list
|
16
|
+
Stack.get(config, stack_name).each do |_, stack|
|
17
|
+
puts("\n", Percheron::Formatters::Stack::Table.new(stack).generate)
|
18
|
+
end
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def logs(container_name, follow: false)
|
23
|
+
stack.logs!(container_name, follow: follow)
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def shell(container_name)
|
28
|
+
stack.shell!(container_name)
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def purge(container_names)
|
33
|
+
stack.purge!(container_names: [ *container_names ])
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def create(container_names, start: false)
|
38
|
+
stack.create!(container_names: [ *container_names ], start: start)
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def recreate(container_names, start: false)
|
43
|
+
stack.create!(container_names: [ *container_names ], start: start)
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def start(container_names)
|
48
|
+
stack.start!(container_names: [ *container_names ])
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop(container_names)
|
53
|
+
stack.stop!(container_names: [ *container_names ])
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def restart(container_names)
|
58
|
+
stack.restart!(container_names: [ *container_names ])
|
59
|
+
nil
|
60
|
+
end
|
8
61
|
end
|
9
62
|
end
|
10
63
|
end
|
@@ -2,11 +2,11 @@ module Percheron
|
|
2
2
|
module Commands
|
3
3
|
class Create < Abstract
|
4
4
|
|
5
|
-
|
5
|
+
default_create_parameters!
|
6
6
|
|
7
7
|
def execute
|
8
|
-
|
9
|
-
stack.create!(
|
8
|
+
super
|
9
|
+
stack.create!(container_names: container_names, start: start?)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -5,9 +5,13 @@ module Percheron
|
|
5
5
|
parameter('STACK_NAME', 'stack name', required: false)
|
6
6
|
|
7
7
|
def execute
|
8
|
-
Stack.get(config, stack_name).each do |
|
9
|
-
|
10
|
-
|
8
|
+
Stack.get(config, stack_name).each do |_, stack|
|
9
|
+
begin
|
10
|
+
stack.valid?
|
11
|
+
puts("\n", Percheron::Formatters::Stack::Table.new(stack).generate)
|
12
|
+
rescue Percheron::Errors::StackInvalid => e
|
13
|
+
signal_usage_error(e.message)
|
14
|
+
end
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Percheron
|
2
|
+
module Commands
|
3
|
+
class Logs < Abstract
|
4
|
+
|
5
|
+
parameter('STACK_NAME', 'stack name', required: true)
|
6
|
+
parameter('CONTAINER_NAME', 'container name', required: true)
|
7
|
+
|
8
|
+
option('--follow', :flag, 'follow the logs', default: false)
|
9
|
+
|
10
|
+
def execute
|
11
|
+
super
|
12
|
+
stack.logs!(container_name, follow: follow?)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,14 +1,17 @@
|
|
1
1
|
module Percheron
|
2
2
|
module Commands
|
3
3
|
class Main < Abstract
|
4
|
-
subcommand
|
4
|
+
subcommand %w(list status), "List stacks and it's containers", List
|
5
5
|
subcommand 'console', 'Start a pry console session', Console
|
6
6
|
subcommand 'start', 'Start a stack', Start
|
7
7
|
subcommand 'stop', 'Stop a stack', Stop
|
8
8
|
subcommand 'restart', 'Restart a stack', Restart
|
9
|
-
subcommand '
|
9
|
+
subcommand 'build', 'Build images for a stack', Build
|
10
|
+
subcommand 'create', 'Build images and create containers for a stack', Create
|
10
11
|
subcommand 'recreate', 'Recreate a stack', Recreate
|
11
12
|
subcommand 'purge', 'Purge a stack', Purge
|
13
|
+
subcommand 'shell', 'Shell into a container', Shell
|
14
|
+
subcommand 'logs', 'Show logs for a container', Logs
|
12
15
|
end
|
13
16
|
end
|
14
17
|
end
|
@@ -2,19 +2,11 @@ module Percheron
|
|
2
2
|
module Commands
|
3
3
|
class Recreate < Abstract
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
option "--force", :flag, 'Force recreation', default: false
|
8
|
-
option "--delete", :flag, 'Delete container + image before recreation', default: false
|
5
|
+
default_create_parameters!
|
9
6
|
|
10
7
|
def execute
|
11
|
-
|
12
|
-
|
13
|
-
force_recreate: force?,
|
14
|
-
delete: delete?
|
15
|
-
}
|
16
|
-
|
17
|
-
stack.recreate!(opts)
|
8
|
+
super
|
9
|
+
stack.recreate!(container_names: container_names, start: start?)
|
18
10
|
end
|
19
11
|
end
|
20
12
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Percheron
|
2
|
+
module Commands
|
3
|
+
class Shell < Abstract
|
4
|
+
|
5
|
+
parameter('STACK_NAME', 'stack name', required: true)
|
6
|
+
parameter('CONTAINER_NAME', 'container name', required: true)
|
7
|
+
|
8
|
+
option('--shell', 'SHELL', 'Shell to use', default: Percheron::Actions::Shell::DEFAULT_SHELL)
|
9
|
+
|
10
|
+
def execute
|
11
|
+
super
|
12
|
+
stack.shell!(container_name, shell: shell)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/percheron/commands.rb
CHANGED
@@ -8,7 +8,10 @@ require 'percheron/commands/stop'
|
|
8
8
|
require 'percheron/commands/purge'
|
9
9
|
require 'percheron/commands/console'
|
10
10
|
require 'percheron/commands/create'
|
11
|
+
require 'percheron/commands/build'
|
11
12
|
require 'percheron/commands/recreate'
|
13
|
+
require 'percheron/commands/shell'
|
14
|
+
require 'percheron/commands/logs'
|
12
15
|
require 'percheron/commands/main'
|
13
16
|
|
14
17
|
module Percheron
|
data/lib/percheron/config.rb
CHANGED
@@ -3,19 +3,20 @@ require 'yaml'
|
|
3
3
|
module Percheron
|
4
4
|
class Config
|
5
5
|
|
6
|
+
DEFAULT_CONFIG_FILE = '.percheron.yml'
|
7
|
+
|
6
8
|
extend Forwardable
|
7
9
|
|
8
10
|
def_delegators :contents, :docker
|
9
11
|
|
10
12
|
def initialize(file)
|
11
13
|
@file = Pathname.new(file).expand_path
|
12
|
-
valid?
|
13
14
|
docker_setup!
|
14
15
|
self
|
15
16
|
end
|
16
17
|
|
17
18
|
def stacks
|
18
|
-
|
19
|
+
process_stacks!
|
19
20
|
end
|
20
21
|
|
21
22
|
def file_base_path
|
@@ -26,10 +27,71 @@ module Percheron
|
|
26
27
|
Validators::Config.new(file).valid?
|
27
28
|
end
|
28
29
|
|
30
|
+
def self.load!(config_file = DEFAULT_CONFIG_FILE)
|
31
|
+
new(config_file)
|
32
|
+
end
|
33
|
+
|
29
34
|
private
|
30
35
|
|
31
36
|
attr_reader :file
|
32
37
|
|
38
|
+
# rubocop:disable Metrics/MethodLength
|
39
|
+
def process_stacks! # FIXME: bugs here :(
|
40
|
+
stacks_by_name = contents.stacks.to_hash_by_key(:name)
|
41
|
+
scanned = scan_container_configs(stacks_by_name)
|
42
|
+
stacks_by_name.each do |_, stack|
|
43
|
+
stack_containers = stack.containers.each_with_object({}) do |container_config, all|
|
44
|
+
if scanned[container_config.name]
|
45
|
+
merge(all, container_config, scanned)
|
46
|
+
else
|
47
|
+
replace_scanned(all, container_config, scanned)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
stack.containers = stack_containers
|
51
|
+
end
|
52
|
+
end
|
53
|
+
# rubocop:enable Metrics/MethodLength
|
54
|
+
|
55
|
+
def merge(all, container_config, scanned) # FIXME: poor name
|
56
|
+
all.merge!(expand_container_config(container_config, scanned[container_config.name]))
|
57
|
+
end
|
58
|
+
|
59
|
+
def replace_scanned(all, container_config, scanned) # FIXME: poor name
|
60
|
+
match = container_config.fetch(:dependant_container_names, [])
|
61
|
+
unless (match & scanned.keys).empty?
|
62
|
+
container_config.dependant_container_names = match.map { |v| scanned[v] }.flatten
|
63
|
+
end
|
64
|
+
all[container_config.name] = container_config
|
65
|
+
end
|
66
|
+
|
67
|
+
def scan_container_configs(stacks_by_name) # FIXME
|
68
|
+
all = {}
|
69
|
+
stacks_by_name.each do |_, stack|
|
70
|
+
stack.containers.each do |container_config|
|
71
|
+
next if container_config.fetch(:instances, 1) == 1
|
72
|
+
all[container_config.name] = 1.upto(container_config.instances).map do |number|
|
73
|
+
"#{container_config.name}#{number}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
all
|
78
|
+
end
|
79
|
+
|
80
|
+
def expand_container_config(container_config, new_container_names) # FIXME
|
81
|
+
new_container_names.each_with_object({}) do |new_name, all|
|
82
|
+
temp_container_config = container_config.dup
|
83
|
+
temp_container_config.delete(:instances)
|
84
|
+
temp_container_config.pseudo_name = container_config.name
|
85
|
+
temp_container_config.name = new_name
|
86
|
+
all[new_name] = eval_container_config(temp_container_config)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def eval_container_config(container_config)
|
91
|
+
template = Liquid::Template.parse(container_config.to_h.to_yaml.to_s)
|
92
|
+
YAML.load(template.render(container_config))
|
93
|
+
end
|
94
|
+
|
33
95
|
def contents
|
34
96
|
Hashie::Mash.new(YAML.load_file(file))
|
35
97
|
end
|
@@ -37,6 +99,5 @@ module Percheron
|
|
37
99
|
def docker_setup!
|
38
100
|
Percheron::DockerConnection.new(self).setup!
|
39
101
|
end
|
40
|
-
|
41
102
|
end
|
42
103
|
end
|