containers 0.1.0 → 0.1.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/exe/ctrs +5 -0
- data/lib/containers/cli.rb +32 -115
- data/lib/containers/commands/attach.rb +11 -0
- data/lib/containers/commands/bash.rb +11 -0
- data/lib/containers/commands/bin.rb +11 -0
- data/lib/containers/commands/down.rb +8 -0
- data/lib/containers/commands/exec.rb +14 -0
- data/lib/containers/commands/inspect.rb +11 -0
- data/lib/containers/commands/list.rb +23 -0
- data/lib/containers/commands/rails/rails.rb +11 -0
- data/lib/containers/commands/restart.rb +12 -0
- data/lib/containers/commands/ruby/bundle.rb +11 -0
- data/lib/containers/commands/ruby/rake.rb +11 -0
- data/lib/containers/commands/start.rb +12 -0
- data/lib/containers/commands/stop.rb +12 -0
- data/lib/containers/commands/tail.rb +11 -0
- data/lib/containers/commands/up.rb +8 -0
- data/lib/containers/commands/yarn/yarn.rb +11 -0
- data/lib/containers/concerns/commandable.rb +19 -0
- data/lib/containers/concerns/configurable.rb +62 -0
- data/lib/containers/generator/cli.rb +43 -0
- data/lib/containers/generator/commands/compose.rb +51 -0
- data/lib/containers/generator/commands/config.rb +43 -0
- data/lib/containers/generator/commands/dockerfile.rb +46 -0
- data/lib/containers/generator/templates/containers.yml.erb +15 -0
- data/lib/containers/{templates → generator/templates}/docker-compose.yml.erb +21 -38
- data/lib/containers/version.rb +1 -1
- data/lib/containers.rb +0 -4
- metadata +106 -32
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -106
- data/LICENSE.txt +0 -21
- data/README.md +0 -24
- data/Rakefile +0 -12
- data/containers.gemspec +0 -42
- data/lib/containers/generator.rb +0 -40
- /data/lib/containers/{templates → generator/templates}/Dockerfile.erb +0 -0
- /data/lib/containers/{templates/redis-cache.conf → generator/templates/redis/cache.conf} +0 -0
- /data/lib/containers/{templates/redis-queue.conf → generator/templates/redis/queue.conf} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd15c1e87342149b417b3b8671d6a435badd75d2bed6c32d4ca81d5cdce6e5b8
|
4
|
+
data.tar.gz: 9066bc4c1a4890a9eea31c5d22d92ed812090ebdb3bc45dad76f130ae686ad7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f6d65ae82057568913304f231b84fa46671418d2e4119469b0e6691cc5937663b33cd06fc4787b5c7fabaffd4f364774fc49b4313a2a8aee71a38d7b4b1d9d0
|
7
|
+
data.tar.gz: 184d0fe60b715ec9e90c39520b54eba1045e13c2247c35ec849d885aa371d7cfcbd510a4c98d1ffaa4f011d3fd7b661b8225c71431f3a1e735218b38cde19840
|
data/exe/ctrs
ADDED
data/lib/containers/cli.rb
CHANGED
@@ -1,141 +1,58 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "pry-byebug"
|
3
4
|
require "thor"
|
4
5
|
require "rainbow"
|
5
|
-
|
6
|
+
require "active_support/all"
|
7
|
+
require_relative "concerns/commandable"
|
8
|
+
require_relative "concerns/configurable"
|
9
|
+
require_relative "generator/cli"
|
6
10
|
|
7
11
|
module Containers
|
8
12
|
class CLI < Thor
|
9
|
-
|
13
|
+
include Commandable
|
14
|
+
include Configurable
|
10
15
|
|
11
|
-
|
16
|
+
Dir["commands/**/*.rb", base: __dir__].each { |f| require_relative f }
|
12
17
|
|
13
18
|
desc "generate", "Commands used to generate files for the project"
|
14
|
-
subcommand "generate", Generator
|
19
|
+
subcommand "generate", Generator::CLI
|
15
20
|
|
16
|
-
|
17
|
-
def up(*args)
|
18
|
-
execute_command "docker compose up -d #{args.join " "}"
|
19
|
-
end
|
20
|
-
|
21
|
-
desc "down", "Tears down the environment defined in docker-compose.yml"
|
22
|
-
def down(*args)
|
23
|
-
execute_command "docker compose down #{args.join " "}"
|
24
|
-
end
|
25
|
-
|
26
|
-
desc "list", "Lists all containers for this project"
|
27
|
-
method_option :detailed, type: :boolean, aliases: "-d", desc: "List detailed container information"
|
28
|
-
method_option :service, type: :boolean, aliases: "-s", desc: "List container service names"
|
29
|
-
def list(*args)
|
30
|
-
return execute_command "docker ps -a | grep #{project_name}" if options[:detailed]
|
31
|
-
|
32
|
-
if options[:service]
|
33
|
-
command = "containers list -f"
|
34
|
-
puts_command "#{command} | #{Rainbow("(strip project name)").green.faint}"
|
35
|
-
list = `#{command}`.split("\n").reject { |item| item.strip == "" || item.include?(COMMAND_PREFIX) }
|
36
|
-
puts list.map { |item| item.gsub(/\A#{project_name}-|\s/, "") }.sort.join("\n")
|
37
|
-
return
|
38
|
-
end
|
39
|
-
|
40
|
-
command = "containers list -d"
|
41
|
-
puts_command "#{command} | #{Rainbow("(strip docker details)").green.faint}"
|
42
|
-
list = `#{command}`.split("\n").reject { |item| item.strip == "" || item.include?(COMMAND_PREFIX) }
|
43
|
-
puts list.map { |item| item.split(" ").last.strip }.sort.join("\n")
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "inspect", "Inspects a container"
|
47
|
-
method_option :container, type: :string, aliases: "-c", required: true, desc: "The short name for the container"
|
48
|
-
def inspect(*args)
|
49
|
-
execute_command "docker inspect #{args.join " "} #{project_name}-#{options[:container]}"
|
50
|
-
end
|
51
|
-
|
52
|
-
desc "attach", "Attaches to a running container"
|
53
|
-
method_option :container, type: :string, aliases: "-c", required: true, desc: "The short name for the container"
|
54
|
-
def attach(*args)
|
55
|
-
execute_command "docker attach #{project_name}-#{options[:container]} #{args.join " "}"
|
56
|
-
end
|
57
|
-
|
58
|
-
desc "exec", "Executes a command in a container"
|
59
|
-
method_option :container, type: :string, aliases: "-c", default: "shell", desc: "The short name for the container"
|
60
|
-
def exec(*args)
|
61
|
-
options[:container] = "shell" if options[:container].to_s.strip == ""
|
62
|
-
execute_command "docker exec -it #{project_name}-#{options[:container]} #{args.join " "}"
|
63
|
-
end
|
64
|
-
|
65
|
-
desc "tail", "Tails container logs"
|
66
|
-
method_option :container, type: :array, aliases: "-c", required: true, desc: "The short name for the container (also supports a list of names)"
|
67
|
-
def tail(*args)
|
68
|
-
args << "--since 5m" unless args.include?("--since")
|
69
|
-
execute_command "docker compose logs #{args.join " "} -f #{options[:container].join " "}"
|
70
|
-
end
|
21
|
+
protected
|
71
22
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
container_names.each { |c| execute_command "docker start #{args.join " "} #{c}", replace_current_process: false }
|
23
|
+
def container_name(service_name)
|
24
|
+
service_name ||= docker_default_service
|
25
|
+
return nil unless service_name
|
26
|
+
"#{app_name}-#{service_name}"
|
77
27
|
end
|
78
28
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
return execute_command "docker stop #{args.join " "} #{project_name}-#{options[:container]}" if options[:container]
|
83
|
-
container_names.each { |c| execute_command "docker stop #{args.join " "} #{c}", replace_current_process: false }
|
29
|
+
def service_name(container_name)
|
30
|
+
return nil unless container_name
|
31
|
+
container_name.sub(/\A#{app_name}-/, "")
|
84
32
|
end
|
85
33
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
containers.each { |c| execute_command "docker restart #{args.join " "} #{c}", replace_current_process: false }
|
91
|
-
end
|
92
|
-
|
93
|
-
desc "bash", "Starts a bash shell"
|
94
|
-
method_option :container, type: :string, aliases: "-c", default: "shell", desc: "The short name for the container"
|
95
|
-
def bash(*args)
|
96
|
-
execute_command "containers exec -c #{options[:container]} bash #{args.join " "}"
|
97
|
-
end
|
98
|
-
|
99
|
-
desc "bundle", "Runs the bundle command"
|
100
|
-
method_option :container, type: :string, aliases: "-c", default: "shell", desc: "The short name for the container"
|
101
|
-
def bundle(*args)
|
102
|
-
execute_command "containers exec -c #{options[:container]} bundle #{args.join " "}"
|
103
|
-
end
|
104
|
-
|
105
|
-
desc "yarn", "Runs the yarn command"
|
106
|
-
method_option :container, type: :string, aliases: "-c", default: "shell", desc: "The short name for the container"
|
107
|
-
def yarn(*args)
|
108
|
-
execute_command "containers exec -c #{options[:container]} yarn #{args.join " "}"
|
109
|
-
end
|
110
|
-
|
111
|
-
desc "rails", "Runs the Rails command"
|
112
|
-
method_option :container, type: :string, aliases: "-c", default: "shell", desc: "The short name for the container"
|
113
|
-
def rails(*args)
|
114
|
-
execute_command "containers bundle -c #{options[:container]} exec rails #{args.join " "}"
|
34
|
+
def service_names
|
35
|
+
`containers list -s`.split("\n").reject do |line|
|
36
|
+
line.nil? || line.empty? || line.include?(Containers::Commandable::PREFIX)
|
37
|
+
end
|
115
38
|
end
|
116
39
|
|
117
|
-
private
|
118
|
-
|
119
40
|
def container_names
|
120
|
-
`containers list
|
121
|
-
|
122
|
-
|
123
|
-
def project_name
|
124
|
-
squish(File.basename(Dir.pwd)).gsub(/\s|_/, "-")
|
125
|
-
end
|
126
|
-
|
127
|
-
def squish(string)
|
128
|
-
string.gsub(/\s+/, " ").strip
|
41
|
+
`containers list`.split("\n").reject do |line|
|
42
|
+
line.nil? || line.empty? || line.include?(Containers::Commandable::PREFIX)
|
43
|
+
end
|
129
44
|
end
|
130
45
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
134
|
-
|
46
|
+
def requested_container_names
|
47
|
+
return options[:container].compact if options[:container]
|
48
|
+
return requested_service_names.map { |name| container_name name }.compact if options[:service]
|
49
|
+
container_names
|
135
50
|
end
|
136
51
|
|
137
|
-
def
|
138
|
-
|
52
|
+
def requested_service_names
|
53
|
+
return options[:service].compact if options[:service]
|
54
|
+
return requested_container_names(options).map { |name| service_name name }.compact if options[:container]
|
55
|
+
service_names
|
139
56
|
end
|
140
57
|
end
|
141
58
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "attach", "Attaches to a running container"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def attach(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "docker attach #{container} #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "bash", "Starts a bash shell"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def bash(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers exec -c #{container} bash #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "bin", "Runs executables in the ./bin directory"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def bin(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers exec -c #{container} bin/#{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "down", "Tears down the environment defined in docker-compose.yml"
|
5
|
+
def down(*args)
|
6
|
+
execute_command "docker compose #{docker_compose_files.map { |f| "-f #{f}" }.join " "} down #{args.join " "}"
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "exec", "Executes a command in a container"
|
5
|
+
long_desc "Also aliased as `x` for convenience"
|
6
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
7
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
8
|
+
def exec(*args)
|
9
|
+
container = options[:container] || container_name(options[:service])
|
10
|
+
execute_command "docker exec -it #{container} #{args.join " "}"
|
11
|
+
end
|
12
|
+
|
13
|
+
map x: :exec
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "inspect", "Inspects a container"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def inspect(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "docker inspect #{args.join " "} #{container}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "list", "Lists all containers for this project"
|
5
|
+
method_option :detailed, type: :boolean, aliases: "-d", desc: "List detailed container information"
|
6
|
+
method_option :service, type: :boolean, aliases: "-s", desc: "List container service names"
|
7
|
+
def list(*args)
|
8
|
+
return execute_command "docker ps -a | grep #{app_name}" if options[:detailed]
|
9
|
+
|
10
|
+
if options[:service]
|
11
|
+
command = "containers list"
|
12
|
+
puts_command "#{command} | #{Rainbow("(strip app_name)").green.faint}"
|
13
|
+
list = `#{command}`.split("\n").reject { |item| item.strip == "" || item.include?(PREFIX) }
|
14
|
+
puts list.map { |item| item.gsub(/\A#{app_name}-|\s/, "") }.sort.join("\n")
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
command = "containers list -d"
|
19
|
+
puts_command "#{command} | #{Rainbow("(strip docker details)").green.faint}"
|
20
|
+
list = `#{command}`.split("\n").reject { |item| item.strip == "" || item.include?(PREFIX) }
|
21
|
+
puts list.map { |item| item.split(" ").last.strip }.sort.join("\n")
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "rails", "Runs the Rails command"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def rails(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers bundle -c #{container} exec rails #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "restart", "Restarts container(s)"
|
5
|
+
method_option :container, type: :array, aliases: "-c", desc: "A list of container names (space delimited)"
|
6
|
+
method_option :service, type: :array, aliases: "-s", desc: "A list of service names (space delimited)"
|
7
|
+
def restart(*args)
|
8
|
+
requested_container_names.each do |container_name|
|
9
|
+
execute_command "docker restart #{args.join " "} #{container_name}", replace_current_process: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "bundle", "Runs the bundle command"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def bundle(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers exec -c #{container} bundle #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "rake", "Runs ruby's rake command"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def rake(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers exec -c #{container} rake #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "start", "Starts container(s)"
|
5
|
+
method_option :container, type: :array, aliases: "-c", desc: "A list of container names (space delimited)"
|
6
|
+
method_option :service, type: :array, aliases: "-s", desc: "A list of service names (space delimited)"
|
7
|
+
def start(*args)
|
8
|
+
requested_container_names.each do |container_name|
|
9
|
+
execute_command "docker start #{args.join " "} #{container_name}", replace_current_process: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "stop", "Stops container(s)"
|
5
|
+
method_option :container, type: :array, aliases: "-c", desc: "A list of container names (space delimited)"
|
6
|
+
method_option :service, type: :array, aliases: "-s", desc: "A list of service names (space delimited)"
|
7
|
+
def stop(*args)
|
8
|
+
requested_container_names.each do |container_name|
|
9
|
+
execute_command "docker stop #{args.join " "} #{container_name}", replace_current_process: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "tail", "Tails container logs"
|
5
|
+
method_option :container, type: :array, aliases: "-c", desc: "A list of container names (space delimited)"
|
6
|
+
method_option :service, type: :array, aliases: "-s", desc: "A list of service names (space delimited)"
|
7
|
+
def tail(*args)
|
8
|
+
args << "--since 5m" unless args.include?("--since")
|
9
|
+
execute_command "docker compose #{docker_compose_files.map { |f| "-f #{f}" }.join " "} logs #{args.join " "} -f #{requested_service_names.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "up", "Brings up the environment defined in docker-compose.yml"
|
5
|
+
def up(*args)
|
6
|
+
execute_command "docker compose #{docker_compose_files.map { |f| "-f #{f}" }.join " "} up -d #{args.join " "}"
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Containers::CLI < Thor
|
4
|
+
desc "yarn", "Runs the yarn command"
|
5
|
+
method_option :container, type: :string, aliases: "-c", desc: "The container name"
|
6
|
+
method_option :service, type: :string, aliases: "-s", desc: "The service name"
|
7
|
+
def yarn(*args)
|
8
|
+
container = options[:container] || container_name(options[:service])
|
9
|
+
execute_command "containers exec -c #{container} yarn #{args.join " "}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Containers::Commandable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
PREFIX = "▶"
|
7
|
+
|
8
|
+
alias_method :execute, :exec
|
9
|
+
|
10
|
+
def puts_command(command)
|
11
|
+
puts "#{Rainbow(PREFIX).green.faint} #{Rainbow(command).green.bright}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_command(command, replace_current_process: true)
|
15
|
+
command = command.squish
|
16
|
+
puts_command command
|
17
|
+
replace_current_process ? execute(command) : puts(`#{command}`)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Containers::Configurable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def self.gitname
|
7
|
+
email = begin
|
8
|
+
`git config --get user.email`.strip
|
9
|
+
rescue
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
email&.split("@")&.first || "example"
|
13
|
+
end
|
14
|
+
|
15
|
+
DEFAULT_CONFIGURATION = {
|
16
|
+
"organization" => {
|
17
|
+
"name" => gitname
|
18
|
+
},
|
19
|
+
"app" => {
|
20
|
+
"name" => File.basename(Dir.pwd).parameterize,
|
21
|
+
"directory" => "."
|
22
|
+
},
|
23
|
+
"docker" => {
|
24
|
+
"directory" => ".",
|
25
|
+
"default_service" => nil,
|
26
|
+
"compose_files" => ["docker-compose.yml"]
|
27
|
+
}
|
28
|
+
}.freeze
|
29
|
+
|
30
|
+
def organization_name
|
31
|
+
configuration["organization"]["name"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def app_name
|
35
|
+
configuration["app"]["name"]
|
36
|
+
end
|
37
|
+
|
38
|
+
def app_directory
|
39
|
+
configuration["app"]["directory"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def docker_directory
|
43
|
+
configuration["docker"]["directory"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def docker_default_service
|
47
|
+
configuration["docker"]["default_service"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def docker_compose_files
|
51
|
+
configuration["docker"]["compose_files"]
|
52
|
+
end
|
53
|
+
|
54
|
+
def configuration
|
55
|
+
@configuration ||=
|
56
|
+
if File.exist?(".containers.yml")
|
57
|
+
YAML.load_file(".containers.yml")
|
58
|
+
else
|
59
|
+
DEFAULT_CONFIGURATION
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "net/http"
|
5
|
+
require "uri"
|
6
|
+
|
7
|
+
module Containers::Generator
|
8
|
+
class CLI < Thor
|
9
|
+
include Containers::Commandable
|
10
|
+
Dir["commands/**/*.rb", base: __dir__].each { |f| require_relative f }
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
def template_path(template_name)
|
15
|
+
Pathname.new(__dir__).join "templates/#{template_name}.erb"
|
16
|
+
end
|
17
|
+
|
18
|
+
def template_string(template_name)
|
19
|
+
File.read template_path(template_name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def template(template_name)
|
23
|
+
ERB.new template_string(template_name), trim_mode: "-"
|
24
|
+
end
|
25
|
+
|
26
|
+
def render_template(template_name, vars = {})
|
27
|
+
view = Struct.new(*vars.keys).new(*vars.values).instance_eval { binding }
|
28
|
+
template(template_name).result view
|
29
|
+
end
|
30
|
+
|
31
|
+
def render_external_template(template, vars = {})
|
32
|
+
view = Struct.new(*vars.keys).new(*vars.values).instance_eval { binding }
|
33
|
+
|
34
|
+
template_string = if template.start_with?("http")
|
35
|
+
Net::HTTP.get URI.parse(template)
|
36
|
+
else
|
37
|
+
File.read template
|
38
|
+
end
|
39
|
+
|
40
|
+
ERB.new(template_string).result view
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require_relative "../../concerns/configurable"
|
5
|
+
|
6
|
+
class Containers::Generator::CLI < Thor
|
7
|
+
include ::Containers::Configurable
|
8
|
+
|
9
|
+
desc "compose", "Creates a docker-compose.yml file for the project"
|
10
|
+
method_option :template, type: :string, aliases: "-t", desc: "The docker-compose.yml template to use (can be a local file or a URL)"
|
11
|
+
def compose
|
12
|
+
FileUtils.mkdir_p docker_directory
|
13
|
+
path = File.expand_path("#{docker_directory}/docker-compose.yml")
|
14
|
+
exists = File.exist?(path)
|
15
|
+
original = File.read(path) if exists
|
16
|
+
|
17
|
+
continue = if exists
|
18
|
+
ask("#{Rainbow("docker-compose.yml already exists").red} Overwrite?", default: "n").to_s.upcase == "Y"
|
19
|
+
else
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
return unless continue
|
24
|
+
|
25
|
+
FileUtils.rm_f path
|
26
|
+
|
27
|
+
vars = {
|
28
|
+
organization: {name: ask("What is the organization name?", default: organization_name).to_s},
|
29
|
+
app: {
|
30
|
+
name: ask("What is the app name?", default: app_name).to_s.parameterize,
|
31
|
+
directory: File.expand_path(ask("What is the path to the app directory? ", default: app_directory).to_s)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
contents = if options[:template]
|
36
|
+
render_external_template options[:template], vars
|
37
|
+
else
|
38
|
+
render_template "docker-compose.yml", vars
|
39
|
+
end
|
40
|
+
|
41
|
+
puts_command Rainbow("(Create #{path})").green.faint
|
42
|
+
File.write path, contents
|
43
|
+
puts Rainbow("docker-compose.yml created successfully").green.bright
|
44
|
+
rescue => error
|
45
|
+
puts Rainbow("Unexpected error! #{error.message}").red.bright
|
46
|
+
if exists && original
|
47
|
+
puts Rainbow("Restoring the original file.").green.faint
|
48
|
+
File.write path, original
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../concerns/configurable"
|
4
|
+
|
5
|
+
class Containers::Generator::CLI < Thor
|
6
|
+
include ::Containers::Configurable
|
7
|
+
|
8
|
+
desc "config", "Creates a .containers.yml config file for the project"
|
9
|
+
def config
|
10
|
+
path = File.expand_path(".containers.yml")
|
11
|
+
exists = File.exist?(path)
|
12
|
+
original = File.read(path) if exists
|
13
|
+
|
14
|
+
continue = if exists
|
15
|
+
ask("#{Rainbow(".containers.yml already exists").red} Overwrite?", default: "n").to_s.upcase == "Y"
|
16
|
+
else
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
return unless continue
|
21
|
+
|
22
|
+
FileUtils.rm_f path
|
23
|
+
|
24
|
+
vars = {
|
25
|
+
organization_name: ask("What is the organization name?", default: organization_name).to_s.parameterize,
|
26
|
+
app_name: ask("What is the app name?", default: app_name).to_s.parameterize,
|
27
|
+
app_directory: File.expand_path(ask("What is the path to the app directory? ", default: app_directory).to_s),
|
28
|
+
docker: {
|
29
|
+
directory: File.expand_path(ask("What is the path to the Docker directory? ", default: docker_directory).to_s),
|
30
|
+
default_service: ask("What is the default Docker service?", default: docker_default_service).to_s,
|
31
|
+
compose_files: docker_compose_files
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
File.write path, render_template("containers.yml", vars)
|
36
|
+
rescue => error
|
37
|
+
puts Rainbow("Unexpected error! #{error.message}").red.bright
|
38
|
+
if exists && original
|
39
|
+
puts Rainbow("Restoring the original file.").green.faint
|
40
|
+
File.write path, original
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|