docker-rails 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +40 -15
- data/docker-rails.gemspec +1 -1
- data/lib/docker/rails/app.rb +23 -6
- data/lib/docker/rails/cli/main.rb +26 -5
- data/lib/docker/rails/config.rb +9 -4
- data/lib/docker/rails/version.rb +1 -1
- data/spec/docker/rails/config_spec.rb +17 -11
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 624744c054f732376d581da291aa2a1130e2a95b
|
4
|
+
data.tar.gz: c764f8d565d3ec58200ca31a67164bf6391001f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5b11391ff8287cb3b213e19c60d4932eaf613ecb9e03cf24617940e4a5ae339b607e1b5f73a804810930be60efd41a1d45aee3c76b674dda3218b5926e14b48
|
7
|
+
data.tar.gz: 0727cd30a851867474794b0556f8c0064d5d8a79222aa903783a4948813595d84af8c3e741eca15feda654138f93564cfe6fc44af2bd3a05712e6cbf52109320
|
data/README.md
CHANGED
@@ -15,25 +15,50 @@ A simplified pattern to execute rails applications within Docker (with a CI buil
|
|
15
15
|
|
16
16
|
## Usage
|
17
17
|
|
18
|
+
### CI
|
19
|
+
|
20
|
+
CI, the reason this is built. Do it all, do it consistently, do it concurrently, do it easily, and always cleanup after yourself.
|
21
|
+
|
22
|
+
```bash
|
23
|
+
bundle exec docker-rails ci --build=222 test
|
24
|
+
```
|
25
|
+
|
26
|
+
or with the environment variable option
|
27
|
+
|
28
|
+
```bash
|
29
|
+
DOCKER_RAILS_BUILD=222 bundle exec docker-rails ci test
|
30
|
+
```
|
31
|
+
|
32
|
+
or for local testing (uses `1` for build)
|
33
|
+
|
34
|
+
```bash
|
35
|
+
bundle exec docker-rails ci test
|
36
|
+
```
|
37
|
+
|
38
|
+
### General CLI
|
39
|
+
|
40
|
+
Almost all of the commands below are in support of the `ci` command, so why not give access directly to them. Helpful additions include `bash_connect` to connect to a running container and `exec` the equivalent of `docker-compose run` (but thor complained and we can't use reserverd word `run`)
|
41
|
+
|
18
42
|
```bash
|
19
43
|
Commands:
|
20
|
-
docker-rails
|
21
|
-
docker-rails
|
22
|
-
docker-rails
|
23
|
-
docker-rails
|
24
|
-
docker-rails
|
25
|
-
docker-rails
|
26
|
-
docker-rails
|
27
|
-
docker-rails
|
28
|
-
docker-rails
|
29
|
-
docker-rails
|
30
|
-
docker-rails
|
31
|
-
docker-rails
|
32
|
-
docker-rails
|
33
|
-
docker-rails
|
44
|
+
docker-rails bash_connect <target> <service_name> # Open a bash shell to a running container e.g. bundle exec docker-rails bash --build=222 development db
|
45
|
+
docker-rails build <target> # Build for the given build/target e.g. bundle exec docker-rails build --build=222 development
|
46
|
+
docker-rails ci <target> # Execute the works, everything with cleanup included e.g. bundle exec docker-rails ci --build=222 test
|
47
|
+
docker-rails cleanup <target> # Runs container cleanup functions stop, rm_volumes, rm_compose, rm_dangling, ps_all e.g. bundle exec docker-rails cleanup --build=222 development
|
48
|
+
docker-rails compose <target> # Writes a resolved docker-compose.yml file e.g. bundle exec docker-rails compose --build=222 test
|
49
|
+
docker-rails db_check <db> # Runs db_check e.g. bundle exec docker-rails db_check mysql
|
50
|
+
docker-rails exec <target> <service_name> <command> # Run an arbitrary command on a given service container e.g. bundle exec docker-rails exec --build=222 development db bash
|
51
|
+
docker-rails gems_volume <command> # Gems volume management e.g. bundle exec docker-rails gems_volume create
|
52
|
+
docker-rails help [COMMAND] # Describe available commands or one specific command
|
53
|
+
docker-rails ps <target> # List containers for the target compose configuration e.g. bundle exec docker-rails ps --build=222 development
|
54
|
+
docker-rails ps_all # List all remaining containers regardless of state e.g. bundle exec docker-rails ps_all
|
55
|
+
docker-rails rm_dangling # Remove danging images e.g. bundle exec docker-rails rm_dangling
|
56
|
+
docker-rails rm_volumes <target> # Stop all running containers and remove corresponding volumes for the given build/target e.g. bundle exec docker-rails rm_volumes --build=222 development
|
57
|
+
docker-rails stop <target> # Stop all running containers for the given build/target e.g. bundle exec docker-rails stop --build=222 development
|
58
|
+
docker-rails up <target> # Up the docker-compose configuration for the given build/target. Use -d for detached mode. e.g. bundle exec docker-rails up -d --build=222 test
|
34
59
|
|
35
60
|
Options:
|
36
|
-
-b, [--build=BUILD] # Build name e.g. 123
|
61
|
+
-b, [--build=BUILD] # Build name e.g. 123. Can also be specified as environment variable DOCKER_RAILS_BUILD
|
37
62
|
# Default: 1
|
38
63
|
```
|
39
64
|
|
data/docker-rails.gemspec
CHANGED
data/lib/docker/rails/app.rb
CHANGED
@@ -23,7 +23,11 @@ module Docker
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def configure(options)
|
26
|
-
|
26
|
+
# Allow CLI option `build` to fallback to an env variable DOCKER_RAILS_BUILD. Note that CLI provides a default build value of 1, so check against the default and existence of the env var.
|
27
|
+
build = options[:build]
|
28
|
+
build = ENV['DOCKER_RAILS_BUILD'] if build.to_i == 1 && !ENV['DOCKER_RAILS_BUILD'].nil?
|
29
|
+
|
30
|
+
ENV['DOCKER_RAILS_BUILD'] = @build = build
|
27
31
|
@target = options[:target]
|
28
32
|
|
29
33
|
# load the docker-rails.yml
|
@@ -64,6 +68,11 @@ module Docker
|
|
64
68
|
exec_compose 'up', false, options #unless skip? :up
|
65
69
|
end
|
66
70
|
|
71
|
+
def exec_build
|
72
|
+
# Run the compose configuration
|
73
|
+
exec_compose 'build'
|
74
|
+
end
|
75
|
+
|
67
76
|
def exec_ps
|
68
77
|
# Run the compose configuration
|
69
78
|
exec_compose 'ps'
|
@@ -75,7 +84,7 @@ module Docker
|
|
75
84
|
@compose_config.each_key do |service_name|
|
76
85
|
stop(service_name)
|
77
86
|
end
|
78
|
-
|
87
|
+
puts 'Done.'
|
79
88
|
end
|
80
89
|
|
81
90
|
def exec_remove_volumes
|
@@ -84,14 +93,17 @@ module Docker
|
|
84
93
|
@compose_config.each_key do |service_name|
|
85
94
|
rm_v(service_name)
|
86
95
|
end
|
87
|
-
|
96
|
+
puts 'Done.'
|
88
97
|
end
|
89
98
|
|
90
99
|
def rm_dangling
|
91
100
|
puts "\n\nCleaning up dangling images..."
|
92
101
|
puts '-----------------------------'
|
93
|
-
|
94
|
-
|
102
|
+
|
103
|
+
list_images_cmd = 'docker images --filter dangling=true -q'
|
104
|
+
output = exec list_images_cmd, true
|
105
|
+
exec "#{list_images_cmd} | xargs docker rmi" if !output.nil? && output.length > 0
|
106
|
+
puts 'Done.'
|
95
107
|
end
|
96
108
|
|
97
109
|
def show_all_containers
|
@@ -100,7 +112,12 @@ module Docker
|
|
100
112
|
system 'docker ps -a'
|
101
113
|
end
|
102
114
|
|
103
|
-
def
|
115
|
+
def exec_run(service_name, command)
|
116
|
+
# Run the compose configuration
|
117
|
+
exec_compose "run #{service_name} #{command}"
|
118
|
+
end
|
119
|
+
|
120
|
+
def exec_bash_connect(service_name)
|
104
121
|
# docker exec -it 222_db_1 bash
|
105
122
|
container_name = get_container_name(service_name)
|
106
123
|
exec "docker exec -it #{container_name} bash"
|
@@ -4,7 +4,7 @@ module Docker
|
|
4
4
|
class Main < Thor
|
5
5
|
# default_task :help
|
6
6
|
|
7
|
-
class_option :build, aliases: ['-b'], type: :string, desc: 'Build name e.g. 123', default: '1'
|
7
|
+
class_option :build, aliases: ['-b'], type: :string, desc: 'Build name e.g. 123. Can also be specified as environment variable DOCKER_RAILS_BUILD', default: '1'
|
8
8
|
|
9
9
|
desc 'db_check <db>', 'Runs db_check e.g. bundle exec docker-rails db_check mysql'
|
10
10
|
subcommand 'db_check', Docker::Rails::CLI::DbCheck
|
@@ -28,6 +28,7 @@ module Docker
|
|
28
28
|
invoke CLI::GemsVolume, :create, [target], options
|
29
29
|
invoke :before
|
30
30
|
begin
|
31
|
+
invoke :build # on CI - always build to ensure dockerfile hasn't been altered - small price to pay for consistent CI.
|
31
32
|
invoke :up
|
32
33
|
ensure
|
33
34
|
invoke :cleanup
|
@@ -61,6 +62,14 @@ module Docker
|
|
61
62
|
app.exec_up(compose_options)
|
62
63
|
end
|
63
64
|
|
65
|
+
desc 'build <target>', 'Build for the given build/target e.g. bundle exec docker-rails build --build=222 development'
|
66
|
+
|
67
|
+
def build(target)
|
68
|
+
invoke :compose
|
69
|
+
App.configured(target, options).exec_build
|
70
|
+
end
|
71
|
+
|
72
|
+
|
64
73
|
desc 'compose <target>', 'Writes a resolved docker-compose.yml file e.g. bundle exec docker-rails compose --build=222 test'
|
65
74
|
|
66
75
|
def compose(target)
|
@@ -89,7 +98,7 @@ module Docker
|
|
89
98
|
App.configured(target, options).exec_remove_volumes
|
90
99
|
end
|
91
100
|
|
92
|
-
desc 'rm_compose', 'Remove generated docker_compose file e.g. bundle exec docker-rails rm_compose --build=222 development'
|
101
|
+
desc 'rm_compose', 'Remove generated docker_compose file e.g. bundle exec docker-rails rm_compose --build=222 development', hide: true
|
93
102
|
|
94
103
|
def rm_compose(build = nil, target = nil)
|
95
104
|
App.instance.rm_compose
|
@@ -114,15 +123,27 @@ module Docker
|
|
114
123
|
App.instance.show_all_containers
|
115
124
|
end
|
116
125
|
|
117
|
-
desc '
|
126
|
+
desc 'bash_connect <target> <service_name>', 'Open a bash shell to a running container e.g. bundle exec docker-rails bash --build=222 development db'
|
127
|
+
|
128
|
+
def bash_connect(target, service_name)
|
129
|
+
# init singleton with full options
|
130
|
+
app = App.configured(target, options)
|
131
|
+
|
132
|
+
invoke :compose, [target], []
|
133
|
+
|
134
|
+
app.exec_bash_connect(service_name)
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
desc 'exec <target> <service_name> <command>', 'Run an arbitrary command on a given service container e.g. bundle exec docker-rails exec --build=222 development db bash'
|
118
139
|
|
119
|
-
def
|
140
|
+
def exec(target, service_name, command)
|
120
141
|
# init singleton with full options
|
121
142
|
app = App.configured(target, options)
|
122
143
|
|
123
144
|
invoke :compose, [target], []
|
124
145
|
|
125
|
-
app.
|
146
|
+
app.exec_run(service_name, command)
|
126
147
|
end
|
127
148
|
|
128
149
|
|
data/lib/docker/rails/config.rb
CHANGED
@@ -13,16 +13,21 @@ module Docker
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def load!(environment, *filenames)
|
16
|
-
if environment.nil?
|
17
|
-
puts 'Environment unspecified, generating docker-compose.yml based on root :compose yaml key.'
|
18
|
-
environment = 'docker-compose'
|
19
|
-
end
|
20
16
|
|
17
|
+
# reject nil target environments
|
18
|
+
raise 'Target environment unspecified.' if environment.nil?
|
19
|
+
|
20
|
+
# default the filename if unspecified
|
21
21
|
if filenames.empty?
|
22
22
|
puts 'Using docker-rails.yml'
|
23
23
|
filenames = ['docker-rails.yml']
|
24
24
|
end
|
25
25
|
|
26
|
+
# reject unknown target environments
|
27
|
+
config = load_unpruned(environment, *filenames)
|
28
|
+
raise "Unknown target environment '#{environment.to_sym}'" if config[environment.to_sym].nil?
|
29
|
+
|
30
|
+
# finally, load the config as internal state
|
26
31
|
super(environment, *filenames)
|
27
32
|
end
|
28
33
|
|
data/lib/docker/rails/version.rb
CHANGED
@@ -19,22 +19,28 @@ describe Docker::Rails::Config do
|
|
19
19
|
expect(config.production).to be_nil
|
20
20
|
end
|
21
21
|
|
22
|
-
it 'should
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
it 'should fail if the target environment does not exist' do
|
23
|
+
expect {
|
24
|
+
Dir.chdir(File.dirname(__FILE__)) do
|
25
|
+
config.clear
|
26
|
+
config.load!(:foo)
|
27
|
+
end
|
28
|
+
}.to raise_error /Unknown target environment/
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
-
expect
|
32
|
-
|
31
|
+
it 'should fail if the target environment is nil' do
|
32
|
+
expect {
|
33
|
+
Dir.chdir(File.dirname(__FILE__)) do
|
34
|
+
config.clear
|
35
|
+
config.load!(nil)
|
36
|
+
end
|
37
|
+
}.to raise_error /Target environment unspecified/
|
33
38
|
end
|
34
39
|
|
40
|
+
|
35
41
|
context ':development' do
|
36
42
|
|
37
|
-
before(:each){
|
43
|
+
before(:each) {
|
38
44
|
Dir.chdir(File.dirname(__FILE__)) do
|
39
45
|
config.clear
|
40
46
|
config.load!(:development)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Ross
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.2.
|
103
|
+
version: 1.2.7
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.2.
|
110
|
+
version: 1.2.7
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: thor
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|