docker-manager 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +0 -0
- data/README.md +0 -0
- data/bin/dockermanager +7 -0
- data/dockermanager.gemspec +22 -0
- data/lib/dockermanager.rb +22 -0
- data/lib/dockermanager/commands/base.rb +36 -0
- data/lib/dockermanager/commands/db_pull.rb +27 -0
- data/lib/dockermanager/commands/deploy.rb +48 -0
- data/lib/dockermanager/config.rb +91 -0
- data/lib/dockermanager/version.rb +3 -0
- metadata +70 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0a2080a569140d0acf090a655ab112f313c0c13d2662f675d141d734a42f8ed5
|
4
|
+
data.tar.gz: 9e3d6c90286d9084e6674de403de8647f441224f2306fb57c2c2b6fd73ffd1bc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79ffc90c9ea9ee06aca3308bb471586e83046546c92252187a04fb5e97b4c98120003a8027e98e33bdb59a59c51340ed98863dd2e4a7a95a318f864e8e58eaf6
|
7
|
+
data.tar.gz: 9673d45e4f8915bd3f8943fc71e3daa3e8cf2776164851ab1127b39e7eabe5ee91f66e189ee285fc4416e1170b37dd1ae880d3981bd7221e210aa26f84df3d42
|
data/CHANGELOG.md
ADDED
File without changes
|
data/README.md
ADDED
File without changes
|
data/bin/dockermanager
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../lib/dockermanager/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'docker-manager'
|
7
|
+
s.version = DockerManager::VERSION
|
8
|
+
s.authors = ['Julien Biard']
|
9
|
+
s.description = ''
|
10
|
+
s.license = ''
|
11
|
+
s.email = 'julien.biard@gmail.com'
|
12
|
+
s.executables = ['dockermanager']
|
13
|
+
s.extra_rdoc_files = %w[CHANGELOG.md README.md]
|
14
|
+
s.files = `git ls-files -z`.split("\0")
|
15
|
+
s.test_files = `git ls-files -z spec/`.split("\0")
|
16
|
+
s.homepage = ''
|
17
|
+
s.summary = ''
|
18
|
+
|
19
|
+
s.add_dependency('sshkit', '1.16.1')
|
20
|
+
|
21
|
+
s.required_ruby_version = '>= 2.0.0'
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/dockermanager/version'
|
2
|
+
require File.dirname(__FILE__) + '/dockermanager/config'
|
3
|
+
require File.dirname(__FILE__) + '/dockermanager/commands/base'
|
4
|
+
require File.dirname(__FILE__) + '/dockermanager/commands/deploy'
|
5
|
+
require File.dirname(__FILE__) + '/dockermanager/commands/db_pull'
|
6
|
+
|
7
|
+
module DockerManager
|
8
|
+
extend self
|
9
|
+
|
10
|
+
def run
|
11
|
+
unless File.exist?("./dockermanager.yml")
|
12
|
+
puts "dockermanager.yml file not found"
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
if ARGV.size != 2
|
16
|
+
puts "usage: dockermanager environment [deploy|db_pull]"
|
17
|
+
exit 2
|
18
|
+
end
|
19
|
+
klass = "Commands::#{ARGV[1].split('_').collect(&:capitalize).join}"
|
20
|
+
const_get(klass).new(env: ARGV[0], config_file: ARGV[2]).run
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'sshkit'
|
2
|
+
require 'sshkit/dsl'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module DockerManager
|
6
|
+
module Commands
|
7
|
+
class Base
|
8
|
+
include SSHKit::DSL
|
9
|
+
|
10
|
+
def initialize(env:, config_file: )
|
11
|
+
self.config = Config.new(
|
12
|
+
env: env,
|
13
|
+
config_file: (config_file || "./dockermanager.yml")
|
14
|
+
)
|
15
|
+
init_sshkit
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
raise "must be implemented"
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
attr_accessor :config
|
24
|
+
|
25
|
+
def init_sshkit
|
26
|
+
SSHKit.config.output_verbosity = Logger::DEBUG
|
27
|
+
SSHKit::Backend::Netssh.configure do |ssh|
|
28
|
+
ssh.ssh_options = {
|
29
|
+
user: config.env_docker_user,
|
30
|
+
auth_methods: %w[publickey]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module DockerManager
|
2
|
+
module Commands
|
3
|
+
class DbPull < Base
|
4
|
+
def run
|
5
|
+
remote_dump_file = "#{config.env_remote_directory}/dump.sql.gz"
|
6
|
+
local_dump_file = "#{config.project_root_path}/tmp/#{File.basename(remote_dump_file)}"
|
7
|
+
remote_postgres_db_container = config.env_remote_postgres_db_container
|
8
|
+
local_postgres_db_container = config.env_local_postgres_db_container
|
9
|
+
project_root_path = config.project_root_path
|
10
|
+
on config.env_host do
|
11
|
+
execute("docker exec -t #{remote_postgres_db_container} bash -c 'PGPASSWORD=$POSTGRES_PASSWORD pg_dump -h $POSTGRES_HOST -U $POSTGRES_USER $POSTGRES_DB --no-acl --no-owner' | gzip - -c --stdout > #{remote_dump_file}")
|
12
|
+
download!(remote_dump_file, local_dump_file)
|
13
|
+
end
|
14
|
+
run_locally do
|
15
|
+
execute(:rm, "#{project_root_path}/tmp/dump.sql")
|
16
|
+
execute("gunzip #{local_dump_file}")
|
17
|
+
# condition pg_stat_activity.datname = \'#{local_database}\' removed
|
18
|
+
execute("docker exec -i #{local_postgres_db_container} bash -c 'psql -U $POSTGRES_USER -d $POSTGRES_DB -c \"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid()\"'")
|
19
|
+
execute("docker exec -i #{local_postgres_db_container} bash -c 'dropdb -U $POSTGRES_USER $POSTGRES_DB'")
|
20
|
+
execute("docker exec -i #{local_postgres_db_container} bash -c 'createdb -U $POSTGRES_USER $POSTGRES_DB'")
|
21
|
+
execute("docker exec -i #{local_postgres_db_container} bash -c 'psql -U $POSTGRES_USER -d $POSTGRES_DB' < #{project_root_path}/tmp/dump.sql")
|
22
|
+
execute(:rm, "#{project_root_path}/tmp/dump.sql")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module DockerManager
|
2
|
+
module Commands
|
3
|
+
class Deploy < Base
|
4
|
+
def run
|
5
|
+
# to avoid scope issue
|
6
|
+
env = config.env
|
7
|
+
project_root_path = config.project_root_path
|
8
|
+
local_docker_path = config.local_docker_path
|
9
|
+
local_deploy_path = config.local_deploy_path
|
10
|
+
registry_login = config.registry_login
|
11
|
+
registry_password = config.registry_password
|
12
|
+
registry_server = config.registry_server
|
13
|
+
env_remote_directory = config.env_remote_directory
|
14
|
+
containers_to_restart = (config.containers_to_restart || []).join(' ')
|
15
|
+
run_locally do
|
16
|
+
# within doesn't work
|
17
|
+
execute("cd #{project_root_path} && ln -sf #{local_deploy_path}/#{env}/.env .env")
|
18
|
+
execute("cd #{project_root_path} && ln -sf #{local_docker_path}/docker-compose.server.yml docker-compose.server.yml")
|
19
|
+
execute("cd #{project_root_path} && docker-compose -f docker-compose.server.yml build")
|
20
|
+
execute("cd #{project_root_path} && docker login -u #{registry_login} -p #{registry_password} #{registry_server}")
|
21
|
+
execute("cd #{project_root_path} && docker-compose -f docker-compose.server.yml push")
|
22
|
+
end
|
23
|
+
on config.env_host do
|
24
|
+
execute(:mkdir, "-p", "#{env_remote_directory}/data")
|
25
|
+
upload!("#{local_deploy_path}/#{env}/.env", "#{env_remote_directory}/.env")
|
26
|
+
upload!("#{local_docker_path}/docker-compose.server.yml", "#{env_remote_directory}/docker-compose.yml")
|
27
|
+
local_ssl_path = "#{local_deploy_path}/#{env}/ssl"
|
28
|
+
if File.readable?(local_ssl_path)
|
29
|
+
execute(:rm, "-fr", "#{env_remote_directory}/ssl")
|
30
|
+
upload!("#{local_deploy_path}/#{env}/ssl", "#{env_remote_directory}/ssl", recursive: true)
|
31
|
+
else
|
32
|
+
local_renew_cert_script = "docker/deploy/#{env}/renew_cert.sh"
|
33
|
+
upload!(local_renew_cert_script, "#{env_remote_directory}/renew_cert.sh") if File.readable?(local_renew_cert_script)
|
34
|
+
end
|
35
|
+
execute("docker login -u #{registry_login} -p #{registry_password} #{registry_server}")
|
36
|
+
execute("cd #{env_remote_directory} && docker-compose pull -q")
|
37
|
+
execute("cd #{env_remote_directory} && docker-compose up -d #{containers_to_restart}")
|
38
|
+
execute("docker system prune -f")
|
39
|
+
end
|
40
|
+
ensure
|
41
|
+
run_locally do
|
42
|
+
execute("cd #{project_root_path} && ln -sf .env.development .env")
|
43
|
+
execute("cd #{project_root_path} && rm docker-compose.server.yml")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module DockerManager
|
2
|
+
class Config
|
3
|
+
KEYS = {
|
4
|
+
env: {
|
5
|
+
required: %i[host docker_user remote_directory remote_postgres_db_container local_postgres_db_container]
|
6
|
+
},
|
7
|
+
registry: {
|
8
|
+
required: %i[login password],
|
9
|
+
optional: %i[server]
|
10
|
+
},
|
11
|
+
required: [],
|
12
|
+
optional: %i[containers_to_restart]
|
13
|
+
}
|
14
|
+
|
15
|
+
attr_reader :env, :config
|
16
|
+
|
17
|
+
def initialize(env:, config_file:)
|
18
|
+
self.env = env
|
19
|
+
self.config = YAML.load_file(config_file)
|
20
|
+
end
|
21
|
+
|
22
|
+
def project_root_path
|
23
|
+
return @project_root_path if defined?(@project_root_path)
|
24
|
+
@project_root_path = value(key: :project_root_path, required: true)
|
25
|
+
unless Dir.exist?(@project_root_path)
|
26
|
+
puts "invalid project_root_path : #{@project_root_path}"
|
27
|
+
exit 3
|
28
|
+
end
|
29
|
+
@project_root_path
|
30
|
+
end
|
31
|
+
|
32
|
+
def local_docker_path
|
33
|
+
return @local_docker_path if defined?(@local_docker_path)
|
34
|
+
@local_docker_path = "#{project_root_path}/docker"
|
35
|
+
unless Dir.exist?(@local_docker_path)
|
36
|
+
puts "invalid local docker path : #{@local_docker_path}"
|
37
|
+
exit 4
|
38
|
+
end
|
39
|
+
@local_docker_path
|
40
|
+
end
|
41
|
+
|
42
|
+
def local_deploy_path
|
43
|
+
return @local_deploy_path if defined?(@local_deploy_path)
|
44
|
+
@local_deploy_path = "#{local_docker_path}/deploy"
|
45
|
+
unless Dir.exist?(@local_deploy_path)
|
46
|
+
puts "invalid local deploy path : #{@local_deploy_path}"
|
47
|
+
exit 5
|
48
|
+
end
|
49
|
+
@local_deploy_path
|
50
|
+
end
|
51
|
+
|
52
|
+
KEYS.keys.each do |parent_key|
|
53
|
+
case parent_key
|
54
|
+
when :required, :optional
|
55
|
+
KEYS[parent_key].each do |key|
|
56
|
+
define_method key do
|
57
|
+
value(key: key, required: (parent_key == :required))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
when :env, :registry
|
61
|
+
%i[required optional].each do |scope|
|
62
|
+
required = (scope == :required)
|
63
|
+
(KEYS[parent_key][scope] || []).each do |key|
|
64
|
+
define_method "#{parent_key}_#{key}" do
|
65
|
+
value(key: key, parent_key: parent_key, required: required)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
attr_writer :env, :config
|
74
|
+
|
75
|
+
def value(key:, parent_key: nil, required:)
|
76
|
+
value_ = if parent_key.nil?
|
77
|
+
config[key.to_s]
|
78
|
+
else
|
79
|
+
if parent_key == :env
|
80
|
+
config["environments"][env][key.to_s]
|
81
|
+
else
|
82
|
+
config[parent_key.to_s][key.to_s]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
return value_ unless value_.nil?
|
86
|
+
return unless required
|
87
|
+
puts "#{[parent_key, key].compact.join('.')} is missing"
|
88
|
+
exit 6
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: docker-manager
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Julien Biard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sshkit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.16.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.16.1
|
27
|
+
description: ''
|
28
|
+
email: julien.biard@gmail.com
|
29
|
+
executables:
|
30
|
+
- dockermanager
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files:
|
33
|
+
- CHANGELOG.md
|
34
|
+
- README.md
|
35
|
+
files:
|
36
|
+
- CHANGELOG.md
|
37
|
+
- README.md
|
38
|
+
- bin/dockermanager
|
39
|
+
- dockermanager.gemspec
|
40
|
+
- lib/dockermanager.rb
|
41
|
+
- lib/dockermanager/commands/base.rb
|
42
|
+
- lib/dockermanager/commands/db_pull.rb
|
43
|
+
- lib/dockermanager/commands/deploy.rb
|
44
|
+
- lib/dockermanager/config.rb
|
45
|
+
- lib/dockermanager/version.rb
|
46
|
+
homepage: ''
|
47
|
+
licenses:
|
48
|
+
- ''
|
49
|
+
metadata: {}
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 2.0.0
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 2.7.6
|
67
|
+
signing_key:
|
68
|
+
specification_version: 4
|
69
|
+
summary: ''
|
70
|
+
test_files: []
|