docker-rails 0.5.6 → 0.6.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 +10 -12
- data/lib/docker/rails.rb +1 -1
- data/lib/docker/rails/app.rb +36 -43
- data/lib/docker/rails/cli/{gems_volume.rb → gemset_volume.rb} +1 -1
- data/lib/docker/rails/cli/main.rb +17 -17
- data/lib/docker/rails/config.rb +58 -0
- data/lib/docker/rails/version.rb +1 -1
- data/spec/docker/rails/config_spec.rb +23 -9
- data/spec/docker/rails/docker-rails.yml +97 -43
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29eddb9dd688e2781429ec0fa43faa2eb5797a60
|
4
|
+
data.tar.gz: fbcb78c9a799b9a7bae895a5727904d344f7a9a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee49cf865269e985ba43848ec8cfe3ceeac29fc58802d4b44b0631ac5065e1f22d26767aff4abaf6619f5a804a0f7baeb1437711d85860c75ab31b7c54e28837
|
7
|
+
data.tar.gz: 44911f7657c234530b003e41f46435862a832ba024553cf8e19bb4869e19ddd2c33a9c159cc7c163a8937fd76b6d134c4f9c8ce3e845d9e91221274747f75bc8
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ A simplified pattern to execute rails applications within Docker (with a CI buil
|
|
9
9
|
- DRY declarative `docker-rails.yml` allowing multiple environments to be defined with an inherited docker `compose` configuration
|
10
10
|
- Provides individual convenience functions `up | bash | stop | extract | cleanup` to easily work with target environment (even in a concurrent situation)
|
11
11
|
- Full workflow for CI usage with automated container, volume, and image cleanup.
|
12
|
-
- Automated cached global
|
12
|
+
- Automated cached global gemset data volume (sets up GEM_HOME and `volumes_from` in all targeted containers)
|
13
13
|
- Interpolates variables `docker-compose.yml` making CI builds much easier
|
14
14
|
- DB check CLI function provided for docker-compose `command` to check if db is ready
|
15
15
|
- Configurable exit_code for `ci` - determine which container's exit code will be the result of the process (useful for CI tests)
|
@@ -28,7 +28,7 @@ CI, the reason this is built. Do it all, do it consistently, do it concurrently,
|
|
28
28
|
|
29
29
|
1. `before_command` - run anything on the host prior to building the docker image e.g. `rm -Rf target`
|
30
30
|
2. `compose` - create the resolved `docker-compose.yml`
|
31
|
-
3. `
|
31
|
+
3. `gemset_volume` - find or create the shared global gems volume for this ruby version
|
32
32
|
4. `build` - `docker-compose build` the configuration
|
33
33
|
5. `up` - `docker-compose up` the configuration
|
34
34
|
6. `cleanup`
|
@@ -79,7 +79,7 @@ Commands:
|
|
79
79
|
docker-rails compose <target> # Writes a resolved docker-compose.yml file e.g. bundle exec docker-rails compose --build=222 test
|
80
80
|
docker-rails db_check <db> # Runs db_check e.g. bundle exec docker-rails db_check mysql
|
81
81
|
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
|
82
|
-
docker-rails
|
82
|
+
docker-rails gemset_volume <command> # Gems volume management e.g. bundle exec docker-rails gemset_volume create
|
83
83
|
docker-rails help [COMMAND] # Describe available commands or one specific command
|
84
84
|
docker-rails ps <target> # List containers for the target compose configuration e.g. bundle exec docker-rails ps --build=222 development
|
85
85
|
docker-rails ps_all # List all remaining containers regardless of state e.g. bundle exec docker-rails ps_all
|
@@ -148,6 +148,13 @@ verbose: true
|
|
148
148
|
exit_code: web
|
149
149
|
before_command: bash -c "rm -Rf target && rm -Rf spec/dummy/log"
|
150
150
|
|
151
|
+
# create a global gemset to be shared amongst all ruby 2.2.2 containers.
|
152
|
+
gemset:
|
153
|
+
name: 2.2.2
|
154
|
+
# setup GEM_HOME environment variable and `volumes_from` to mount the global gemset container
|
155
|
+
containers:
|
156
|
+
- web
|
157
|
+
|
151
158
|
extractions: &extractions
|
152
159
|
web:
|
153
160
|
extract:
|
@@ -295,15 +302,6 @@ compose:
|
|
295
302
|
links:
|
296
303
|
- db
|
297
304
|
|
298
|
-
volumes_from:
|
299
|
-
# Mount the gems data volume container for cached bundler gem files
|
300
|
-
- #{DOCKER_RAILS_GEMS_VOLUME_NAME}
|
301
|
-
|
302
|
-
# https://docs.docker.com/v1.6/docker-compose/cli/#environment-variables
|
303
|
-
environment:
|
304
|
-
# Tell bundler where to get the files
|
305
|
-
- GEM_HOME=#{DOCKER_RAILS_GEMS_VOLUME_PATH}
|
306
|
-
|
307
305
|
db:
|
308
306
|
# https://github.com/docker-library/docs/tree/master/mysql
|
309
307
|
image: library/mysql:5.7.6
|
data/lib/docker/rails.rb
CHANGED
data/lib/docker/rails/app.rb
CHANGED
@@ -9,8 +9,8 @@ module Docker
|
|
9
9
|
:build, # given build, usually a number
|
10
10
|
:project_name, # resolved compose project name
|
11
11
|
:target,
|
12
|
-
:
|
13
|
-
:
|
12
|
+
:gemset_volume_path,
|
13
|
+
:gemset_volume_name,
|
14
14
|
:compose_filename,
|
15
15
|
:exit_code
|
16
16
|
|
@@ -27,8 +27,6 @@ module Docker
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def initialize
|
30
|
-
discover_ruby_version
|
31
|
-
set_gems_volume_vars
|
32
30
|
end
|
33
31
|
|
34
32
|
def configure(options)
|
@@ -51,9 +49,32 @@ module Docker
|
|
51
49
|
@config = Docker::Rails::Config.new
|
52
50
|
@config.load!(@target)
|
53
51
|
|
52
|
+
# these are generated/resolved in the config#load, grab them for convenience
|
53
|
+
@gemset_volume_path = ENV['DOCKER_RAILS_GEMSET_VOLUME_PATH']
|
54
|
+
@gemset_volume_name = ENV['DOCKER_RAILS_GEMSET_VOLUME_NAME']
|
55
|
+
|
54
56
|
@is_configured = true
|
55
57
|
end
|
56
58
|
|
59
|
+
def compose
|
60
|
+
# Write a docker-compose.yml with interpolated variables
|
61
|
+
@compose_filename = compose_filename_from @project_name
|
62
|
+
|
63
|
+
rm_compose
|
64
|
+
|
65
|
+
@config.write_docker_compose_file(@compose_filename)
|
66
|
+
|
67
|
+
@compose_config = Docker::Rails::ComposeConfig.new
|
68
|
+
@compose_config.load!(nil, @compose_filename)
|
69
|
+
|
70
|
+
# check the exit_code
|
71
|
+
if @config['exit_code'].nil?
|
72
|
+
first_defined_service = @compose_config.keys[0]
|
73
|
+
puts "exit_code not set in configuration, using exit code from first defined service: #{first_defined_service}"
|
74
|
+
@config['exit_code'] = first_defined_service
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
57
78
|
def is_configured?
|
58
79
|
@is_configured || false
|
59
80
|
end
|
@@ -105,25 +126,6 @@ module Docker
|
|
105
126
|
end
|
106
127
|
end
|
107
128
|
|
108
|
-
def compose
|
109
|
-
# Write a docker-compose.yml with interpolated variables
|
110
|
-
@compose_filename = compose_filename_from @project_name
|
111
|
-
|
112
|
-
rm_compose
|
113
|
-
|
114
|
-
@config.write_docker_compose_file(@compose_filename)
|
115
|
-
|
116
|
-
@compose_config = Docker::Rails::ComposeConfig.new
|
117
|
-
@compose_config.load!(nil, @compose_filename)
|
118
|
-
|
119
|
-
# check the exit_code
|
120
|
-
if @config['exit_code'].nil?
|
121
|
-
first_defined_service = @compose_config.keys[0]
|
122
|
-
puts "exit_code not set in configuration, using exit code from first defined service: #{first_defined_service}"
|
123
|
-
@config['exit_code'] = first_defined_service
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
129
|
def rm_compose
|
128
130
|
# Delete old docker compose files
|
129
131
|
exec "rm #{compose_filename_from '*'}" rescue ''
|
@@ -250,7 +252,7 @@ module Docker
|
|
250
252
|
puts '-----------------------------'
|
251
253
|
|
252
254
|
list_images_cmd = 'docker images --filter dangling=true -q'
|
253
|
-
output = exec(
|
255
|
+
output = exec(list_images_cmd, true)
|
254
256
|
|
255
257
|
# if there are any dangling, let's clean them up.
|
256
258
|
exec("#{list_images_cmd} | xargs docker rmi", false, true) if !output.nil? && output.length > 0
|
@@ -259,7 +261,7 @@ module Docker
|
|
259
261
|
|
260
262
|
def run_service_command(service_name, command)
|
261
263
|
# Run the compose configuration
|
262
|
-
exec_compose
|
264
|
+
exec_compose("run #{service_name} #{command}", false, '', true)
|
263
265
|
end
|
264
266
|
|
265
267
|
def bash_connect(service_name)
|
@@ -278,12 +280,12 @@ module Docker
|
|
278
280
|
# https://docs.docker.com/userguide/dockervolumes/
|
279
281
|
def create_gems_volume
|
280
282
|
begin
|
281
|
-
Docker::Container.get(@
|
282
|
-
puts "Gem data volume container #{@
|
283
|
+
Docker::Container.get(@gemset_volume_name)
|
284
|
+
puts "Gem data volume container #{@gemset_volume_name} already exists."
|
283
285
|
rescue Docker::Error::NotFoundError => e
|
284
286
|
|
285
|
-
exec "docker create -v #{@
|
286
|
-
puts "Gem data volume container #{@
|
287
|
+
exec "docker create -v #{@gemset_volume_path} --name #{@gemset_volume_name} busybox"
|
288
|
+
puts "Gem data volume container #{@gemset_volume_name} created."
|
287
289
|
end
|
288
290
|
end
|
289
291
|
|
@@ -302,8 +304,11 @@ module Docker
|
|
302
304
|
end
|
303
305
|
|
304
306
|
# convenience to execute docker-compose with file and project params
|
305
|
-
def exec_compose(cmd, capture = false, options = '')
|
306
|
-
|
307
|
+
def exec_compose(cmd, capture = false, options = '', ignore_errors = false)
|
308
|
+
# in the case of running a bash session, this file may dissappear, just make sure it is there.
|
309
|
+
compose unless File.exists?(@compose_filename)
|
310
|
+
|
311
|
+
exec("docker-compose -f #{@compose_filename} -p #{@project_name} #{cmd} #{options}", capture, ignore_errors)
|
307
312
|
end
|
308
313
|
|
309
314
|
def get_container(service_name)
|
@@ -330,18 +335,6 @@ module Docker
|
|
330
335
|
@verbose ||= (@config['verbose'] unless @config.nil?) || false
|
331
336
|
end
|
332
337
|
|
333
|
-
def set_gems_volume_vars
|
334
|
-
# Set as variable for interpolation
|
335
|
-
ENV['DOCKER_RAILS_GEMS_VOLUME_PATH'] = @gems_volume_path = "/gems/#{@ruby_version}"
|
336
|
-
ENV['DOCKER_RAILS_GEMS_VOLUME_NAME'] = @gems_volume_name = "gems-#{@ruby_version}"
|
337
|
-
end
|
338
|
-
|
339
|
-
def discover_ruby_version
|
340
|
-
# Discover ruby version from the Dockerfile image
|
341
|
-
IO.read('Dockerfile') =~ /^FROM \w+\/ruby:(\d+.\d+(?:.\d+))/
|
342
|
-
@ruby_version = $1
|
343
|
-
end
|
344
|
-
|
345
338
|
# accessible so that we can delete patterns
|
346
339
|
def compose_filename_from(project_name)
|
347
340
|
"docker-compose-#{project_name}.yml"
|
@@ -9,10 +9,10 @@ module Docker
|
|
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
|
11
11
|
|
12
|
-
desc '
|
13
|
-
subcommand '
|
12
|
+
desc 'gemset_volume <command>', 'Gemset volume management e.g. docker-rails gemset_volume create'
|
13
|
+
subcommand 'gemset_volume', Docker::Rails::CLI::GemsetVolume
|
14
14
|
|
15
|
-
desc 'ci <target>', 'Execute the works, everything with cleanup included e.g.
|
15
|
+
desc 'ci <target>', 'Execute the works, everything with cleanup included e.g. docker-rails ci --build=222 test'
|
16
16
|
long_desc <<-D
|
17
17
|
|
18
18
|
`ci` will run the target with the given build (-b) number then cleanup everything upon completion.
|
@@ -26,7 +26,7 @@ module Docker
|
|
26
26
|
|
27
27
|
invoke :before, [target], []
|
28
28
|
invoke :compose, [target], []
|
29
|
-
invoke CLI::
|
29
|
+
invoke CLI::GemsetVolume, :create, [target], options
|
30
30
|
begin
|
31
31
|
invoke :build # on CI - always build to ensure dockerfile hasn't been altered - small price to pay for consistent CI.
|
32
32
|
invoke :up
|
@@ -45,7 +45,7 @@ module Docker
|
|
45
45
|
app.extract
|
46
46
|
end
|
47
47
|
|
48
|
-
desc 'cleanup <target>', 'Runs container cleanup functions stop, rm_volumes, rm_compose, rm_dangling, ps_all e.g.
|
48
|
+
desc 'cleanup <target>', 'Runs container cleanup functions stop, rm_volumes, rm_compose, rm_dangling, ps_all e.g. docker-rails cleanup --build=222 development'
|
49
49
|
option :extract, aliases: ['-e'], type: :boolean, default: true, desc: 'Extract any directories defined in configuration.'
|
50
50
|
|
51
51
|
def cleanup(target)
|
@@ -57,7 +57,7 @@ module Docker
|
|
57
57
|
invoke :ps_all
|
58
58
|
end
|
59
59
|
|
60
|
-
desc 'up <target>', 'Up the docker-compose configuration for the given build/target. Use -d for detached mode. e.g.
|
60
|
+
desc 'up <target>', 'Up the docker-compose configuration for the given build/target. Use -d for detached mode. e.g. docker-rails up -d --build=222 test'
|
61
61
|
option :detached, aliases: ['-d'], type: :boolean, desc: 'Detached mode: Run containers in the background'
|
62
62
|
|
63
63
|
def up(target)
|
@@ -66,7 +66,7 @@ module Docker
|
|
66
66
|
base_options = options.except(:detached)
|
67
67
|
|
68
68
|
invoke :before, [target], base_options
|
69
|
-
invoke CLI::
|
69
|
+
invoke CLI::GemsetVolume, :create, [target], base_options
|
70
70
|
|
71
71
|
compose_options = ''
|
72
72
|
compose_options = '-d' if options[:detached]
|
@@ -74,14 +74,14 @@ module Docker
|
|
74
74
|
app.up(compose_options)
|
75
75
|
end
|
76
76
|
|
77
|
-
desc 'build <target>', 'Build for the given build/target e.g.
|
77
|
+
desc 'build <target>', 'Build for the given build/target e.g. docker-rails build --build=222 development'
|
78
78
|
|
79
79
|
def build(target)
|
80
80
|
invoke :compose
|
81
81
|
App.configured(target, options).compose_build
|
82
82
|
end
|
83
83
|
|
84
|
-
desc 'compose <target>', 'Writes a resolved docker-compose.yml file e.g.
|
84
|
+
desc 'compose <target>', 'Writes a resolved docker-compose.yml file e.g. docker-rails compose --build=222 test'
|
85
85
|
|
86
86
|
def compose(target)
|
87
87
|
App.configured(target, options).compose
|
@@ -95,46 +95,46 @@ module Docker
|
|
95
95
|
app.before_command
|
96
96
|
end
|
97
97
|
|
98
|
-
desc 'stop <target>', 'Stop all running containers for the given build/target e.g.
|
98
|
+
desc 'stop <target>', 'Stop all running containers for the given build/target e.g. docker-rails stop --build=222 development'
|
99
99
|
|
100
100
|
def stop(target)
|
101
101
|
invoke :compose
|
102
102
|
App.configured(target, options).stop
|
103
103
|
end
|
104
104
|
|
105
|
-
desc 'rm_volumes <target>', 'Stop all running containers and remove corresponding volumes for the given build/target e.g.
|
105
|
+
desc 'rm_volumes <target>', 'Stop all running containers and remove corresponding volumes for the given build/target e.g. docker-rails rm_volumes --build=222 development'
|
106
106
|
|
107
107
|
def rm_volumes(target)
|
108
108
|
invoke :stop
|
109
109
|
App.configured(target, options).rm_volumes
|
110
110
|
end
|
111
111
|
|
112
|
-
desc 'rm_compose', 'Remove generated docker_compose file e.g.
|
112
|
+
desc 'rm_compose', 'Remove generated docker_compose file e.g. docker-rails rm_compose --build=222 development', hide: true
|
113
113
|
|
114
114
|
def rm_compose(build = nil, target = nil)
|
115
115
|
App.instance.rm_compose
|
116
116
|
end
|
117
117
|
|
118
|
-
desc 'rm_dangling', 'Remove danging images e.g.
|
118
|
+
desc 'rm_dangling', 'Remove danging images e.g. docker-rails rm_dangling'
|
119
119
|
|
120
120
|
def rm_dangling(build = nil, target = nil)
|
121
121
|
App.instance.rm_dangling
|
122
122
|
end
|
123
123
|
|
124
|
-
desc 'ps <target>', 'List containers for the target compose configuration e.g.
|
124
|
+
desc 'ps <target>', 'List containers for the target compose configuration e.g. docker-rails ps --build=222 development'
|
125
125
|
|
126
126
|
def ps(target)
|
127
127
|
invoke :compose
|
128
128
|
App.configured(target, options).ps
|
129
129
|
end
|
130
130
|
|
131
|
-
desc 'ps_all', 'List all remaining containers regardless of state e.g.
|
131
|
+
desc 'ps_all', 'List all remaining containers regardless of state e.g. docker-rails ps_all'
|
132
132
|
|
133
133
|
def ps_all(build = nil, target = nil)
|
134
134
|
App.instance.ps_all
|
135
135
|
end
|
136
136
|
|
137
|
-
desc 'bash_connect <target> <service_name>', 'Open a bash shell to a running container (with automatic cleanup) e.g.
|
137
|
+
desc 'bash_connect <target> <service_name>', 'Open a bash shell to a running container (with automatic cleanup) e.g. docker-rails bash --build=222 development db'
|
138
138
|
|
139
139
|
def bash_connect(target, service_name)
|
140
140
|
# init singleton with full options
|
@@ -150,7 +150,7 @@ module Docker
|
|
150
150
|
container.remove(v: true, force: true)
|
151
151
|
end
|
152
152
|
|
153
|
-
desc 'exec <target> <service_name> <command>', 'Run an arbitrary command on a given service container e.g.
|
153
|
+
desc 'exec <target> <service_name> <command>', 'Run an arbitrary command on a given service container e.g. docker-rails exec --build=222 development db bash'
|
154
154
|
|
155
155
|
def exec(target, service_name, command)
|
156
156
|
# init singleton with full options
|
data/lib/docker/rails/config.rb
CHANGED
@@ -2,6 +2,20 @@ module Docker
|
|
2
2
|
module Rails
|
3
3
|
require 'dry/config'
|
4
4
|
class Config < Dry::Config::Base
|
5
|
+
|
6
|
+
# environment:
|
7
|
+
# # make ssh keys available via ssh forwarding (see volume entry)
|
8
|
+
# - SSH_AUTH_SOCK=/ssh-agent/socket
|
9
|
+
#
|
10
|
+
# volumes_from:
|
11
|
+
# # Use configured whilp/ssh-agent long running container for keys
|
12
|
+
# - ssh-agent
|
13
|
+
SSH_AGENT_DEFAULT_CONFIG = {
|
14
|
+
environment: ['SSH_AUTH_SOCK=/ssh-agent/socket'],
|
15
|
+
volumes_from: ['ssh-agent']
|
16
|
+
}
|
17
|
+
|
18
|
+
|
5
19
|
def initialize(options = {})
|
6
20
|
super({
|
7
21
|
default_configuration: {
|
@@ -27,6 +41,50 @@ module Docker
|
|
27
41
|
config = load_unpruned(environment, *filenames)
|
28
42
|
raise "Unknown target environment '#{environment.to_sym}'" if config[environment.to_sym].nil?
|
29
43
|
|
44
|
+
|
45
|
+
# -----------------------------------------------------
|
46
|
+
# Generate defaults for GEMSET_VOLUME and SSH_AGENT
|
47
|
+
generated_defaults = {compose: {}}
|
48
|
+
compose = generated_defaults[:compose]
|
49
|
+
|
50
|
+
# ----
|
51
|
+
# ssh-agent
|
52
|
+
ssh_agent = config[:'ssh-agent']
|
53
|
+
if !ssh_agent.nil?
|
54
|
+
ssh_agent[:containers].each do |container|
|
55
|
+
raise "Unknown container #{container}" if config[:compose][container.to_sym].nil?
|
56
|
+
compose[container.to_sym] ||= {}
|
57
|
+
compose[container.to_sym].deeper_merge! ({}.merge SSH_AGENT_DEFAULT_CONFIG)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# ----
|
62
|
+
# gemset volume
|
63
|
+
gemset = config[:gemset]
|
64
|
+
raise "Expected to find 'gemset:' in #{filenames}" if gemset.nil?
|
65
|
+
|
66
|
+
gemset_name = gemset[:name]
|
67
|
+
raise "Expected to find 'gemset: name' in #{filenames}" if gemset_name.nil?
|
68
|
+
|
69
|
+
ENV['DOCKER_RAILS_GEMSET_VOLUME_PATH'] = gemset_volume_path = "/gemset/#{gemset_name}"
|
70
|
+
ENV['DOCKER_RAILS_GEMSET_VOLUME_NAME'] = gemset_volume_name = "gemset-#{gemset_name}"
|
71
|
+
|
72
|
+
raise "Expected to find 'gemset: containers' with at least one entry" if gemset[:containers].nil? || gemset[:containers].length < 1
|
73
|
+
gemset[:containers].each do |container|
|
74
|
+
raise "Unknown container #{container}" if config[:compose][container.to_sym].nil?
|
75
|
+
compose[container.to_sym] ||= {}
|
76
|
+
compose[container.to_sym].deeper_merge! ({
|
77
|
+
environment: ["GEM_HOME=#{gemset_volume_path}"],
|
78
|
+
volumes_from: [gemset_volume_name]
|
79
|
+
})
|
80
|
+
end
|
81
|
+
|
82
|
+
# now add the generated to the seeded default configuration
|
83
|
+
@default_configuration.merge!(generated_defaults)
|
84
|
+
|
85
|
+
# reset the base @configuration by loading the new default configuration
|
86
|
+
clear
|
87
|
+
|
30
88
|
# finally, load the config as internal state
|
31
89
|
super(environment, *filenames)
|
32
90
|
end
|
data/lib/docker/rails/version.rb
CHANGED
@@ -23,7 +23,7 @@ describe Docker::Rails::Config do
|
|
23
23
|
expect {
|
24
24
|
Dir.chdir(File.dirname(__FILE__)) do
|
25
25
|
config.clear
|
26
|
-
config.load!(:
|
26
|
+
config.load!(:foobar)
|
27
27
|
end
|
28
28
|
}.to raise_error /Unknown target environment/
|
29
29
|
end
|
@@ -39,11 +39,11 @@ describe Docker::Rails::Config do
|
|
39
39
|
|
40
40
|
|
41
41
|
context ':development' do
|
42
|
-
|
42
|
+
let(:target_env){ :development}
|
43
43
|
before(:each) {
|
44
44
|
Dir.chdir(File.dirname(__FILE__)) do
|
45
45
|
config.clear
|
46
|
-
config.load!(
|
46
|
+
config.load!(target_env)
|
47
47
|
end
|
48
48
|
}
|
49
49
|
|
@@ -62,16 +62,30 @@ describe Docker::Rails::Config do
|
|
62
62
|
expect(config.production).to be_nil
|
63
63
|
end
|
64
64
|
|
65
|
-
it 'should write a docker-compose file' do
|
66
|
-
file = tmp_file
|
67
|
-
config.write_docker_compose_file(file)
|
68
|
-
end
|
69
|
-
|
70
65
|
it 'should manipulate command to yaml single line' do
|
71
66
|
yaml = config.to_yaml
|
72
67
|
expect(yaml).to include 'command: >'
|
73
68
|
expect(yaml).not_to include 'command: |'
|
74
69
|
end
|
70
|
+
|
71
|
+
context 'compose' do
|
72
|
+
let(:compose_config) {
|
73
|
+
file = tmp_file('compose')
|
74
|
+
config.write_docker_compose_file(file)
|
75
|
+
compose_config =Docker::Rails::ComposeConfig.new
|
76
|
+
compose_config.load!(nil, file)
|
77
|
+
compose_config
|
78
|
+
}
|
79
|
+
|
80
|
+
it 'web should have ssh-agent' do
|
81
|
+
expect(compose_config[:web][:environment]).to include('SSH_AUTH_SOCK=/ssh-agent/socket')
|
82
|
+
expect(compose_config[:web][:volumes_from]).to include('ssh-agent')
|
83
|
+
end
|
84
|
+
it 'web should have gemset' do
|
85
|
+
expect(compose_config[:web][:environment]).to include('GEM_HOME=/gemset/2.2.2')
|
86
|
+
expect(compose_config[:web][:volumes_from]).to include('gemset-2.2.2')
|
87
|
+
end
|
88
|
+
end
|
75
89
|
end
|
76
90
|
|
77
91
|
# it 'should read specific file' do
|
@@ -90,7 +104,7 @@ describe Docker::Rails::Config do
|
|
90
104
|
end
|
91
105
|
|
92
106
|
def tmp_file(name = 'foo')
|
93
|
-
file = File.expand_path("../../../../tmp/#{name}-docker-rails.yml", __FILE__)
|
107
|
+
file = File.expand_path("../../../../tmp/#{name}-docker-rails-config_spec.yml", __FILE__)
|
94
108
|
FileUtils.mkdir_p File.dirname file
|
95
109
|
file
|
96
110
|
end
|
@@ -1,4 +1,53 @@
|
|
1
1
|
verbose: true
|
2
|
+
before_command: bash -c "rm -Rf target && rm -Rf log"
|
3
|
+
exit_code: web
|
4
|
+
|
5
|
+
# create a global gemset to be shared amongst all ruby 2.2.2 containers.
|
6
|
+
gemset:
|
7
|
+
name: 2.2.2
|
8
|
+
# setup GEM_HOME environment variable and `volumes_from` to mount the global gemset container
|
9
|
+
containers:
|
10
|
+
- web
|
11
|
+
|
12
|
+
# Generated:
|
13
|
+
#compose:
|
14
|
+
# web:
|
15
|
+
# environment:
|
16
|
+
# # Tell bundler where to get the files
|
17
|
+
# - GEM_HOME=/gemset/2.2.2
|
18
|
+
#
|
19
|
+
# volumes_from:
|
20
|
+
# # Mount the gems data volume container for cached bundler gem files
|
21
|
+
# - gemset-2.2.2
|
22
|
+
|
23
|
+
|
24
|
+
# Make the host user's id_rsa key available to the web container e.g. for cloning from github
|
25
|
+
ssh-agent:
|
26
|
+
containers:
|
27
|
+
- web
|
28
|
+
keys:
|
29
|
+
- id_rsa
|
30
|
+
|
31
|
+
# Generated:
|
32
|
+
#compose:
|
33
|
+
# web:
|
34
|
+
# environment:
|
35
|
+
# # make ssh keys available via ssh forwarding (see volume entry)
|
36
|
+
# - SSH_AUTH_SOCK=/ssh-agent/socket
|
37
|
+
#
|
38
|
+
# volumes_from:
|
39
|
+
# # Use configured whilp/ssh-agent long running container for keys
|
40
|
+
# - ssh-agent
|
41
|
+
|
42
|
+
|
43
|
+
extractions: &extractions
|
44
|
+
web:
|
45
|
+
extract:
|
46
|
+
- '/project/target'
|
47
|
+
- '/project/vcr'
|
48
|
+
- '/project/tmp/parallel_runtime_cucumber.log:./tmp'
|
49
|
+
- '/project/tmp/parallel_runtime_rspec.log:./tmp'
|
50
|
+
- '/project/log'
|
2
51
|
|
3
52
|
# local environments need elasticsearch, staging/production connects to existing running instance.
|
4
53
|
elasticsearch: &elasticsearch
|
@@ -7,6 +56,16 @@ elasticsearch: &elasticsearch
|
|
7
56
|
ports:
|
8
57
|
- "9200"
|
9
58
|
|
59
|
+
foo:
|
60
|
+
compose:
|
61
|
+
web:
|
62
|
+
command: bash -c "sleep 10 && echo 'foo' && exit 187"
|
63
|
+
|
64
|
+
bundle_only:
|
65
|
+
compose:
|
66
|
+
web:
|
67
|
+
command: bash -c "bundle install --jobs 4 --retry 3"
|
68
|
+
|
10
69
|
development:
|
11
70
|
compose:
|
12
71
|
<<: *elasticsearch
|
@@ -24,25 +83,25 @@ development:
|
|
24
83
|
&& echo 'Generating Spring binstubs'
|
25
84
|
&& bundle exec spring binstub --all
|
26
85
|
|
27
|
-
&& echo 'Clearing logs
|
28
|
-
&& bundle exec rake log:clear
|
86
|
+
&& echo 'Clearing logs'
|
87
|
+
&& bundle exec rake log:clear
|
29
88
|
|
30
89
|
&& echo 'Check and wait for database connection'
|
31
90
|
&& bundle exec docker-rails db_check mysql
|
32
91
|
|
33
|
-
&& echo '
|
34
|
-
&& bundle exec rake db:
|
92
|
+
&& echo 'DB rebuild'
|
93
|
+
&& bundle exec rake db:rebuild_dev
|
35
94
|
|
36
95
|
&& echo "Starting app server"
|
37
96
|
&& bundle exec rails s -p 3000
|
38
|
-
|
39
|
-
&& echo 'Setup and start foreman'
|
40
|
-
&& gem install foreman
|
41
|
-
&& foreman start
|
42
97
|
"
|
43
98
|
|
99
|
+
# && echo 'Setup and start foreman'
|
100
|
+
# && gem install foreman
|
101
|
+
# && foreman start
|
102
|
+
|
44
103
|
test:
|
45
|
-
|
104
|
+
<<: *extractions
|
46
105
|
compose:
|
47
106
|
<<: *elasticsearch
|
48
107
|
web:
|
@@ -55,22 +114,28 @@ test:
|
|
55
114
|
echo 'Bundling gems'
|
56
115
|
&& bundle install --jobs 4 --retry 3
|
57
116
|
|
58
|
-
&& echo 'Clearing logs and tmp dirs'
|
59
|
-
&& bundle exec rake log:clear tmp:clear
|
60
|
-
|
61
117
|
&& echo 'Check and wait for database connection'
|
62
118
|
&& bundle exec docker-rails db_check mysql
|
63
119
|
|
64
|
-
&& echo '
|
65
|
-
&& bundle exec rake db:
|
120
|
+
&& echo 'DB rebuild'
|
121
|
+
&& bundle exec rake db:rebuild_test
|
66
122
|
|
67
123
|
&& echo 'Tests'
|
68
124
|
&& cd ../..
|
69
|
-
&& xvfb-run -a bundle exec rake
|
125
|
+
&& xvfb-run -a bundle exec rake \
|
126
|
+
spec SPEC=spec/app/models/batch/csv_spec.rb \
|
127
|
+
cucumber FEATURE=features/activation/4_admin_import_members.feature
|
70
128
|
"
|
71
129
|
|
130
|
+
# && xvfb-run -a bundle exec rake spec
|
131
|
+
# && xvfb-run -a bundle exec rake spec SPEC=spec/app/models/plan_spec.rb
|
132
|
+
# && xvfb-run -a bundle exec rake spec SPEC=spec/app/models/plan_spec.rb cucumber FEATURE=features/public_pages.feature
|
133
|
+
|
134
|
+
# cucumber
|
135
|
+
# rake FEATURE=features/adding_products.feature cucumber
|
136
|
+
|
72
137
|
parallel_tests:
|
73
|
-
|
138
|
+
<<: *extractions
|
74
139
|
compose:
|
75
140
|
<<: *elasticsearch
|
76
141
|
web:
|
@@ -82,20 +147,17 @@ parallel_tests:
|
|
82
147
|
bash -c "
|
83
148
|
|
84
149
|
echo 'Bundling gems'
|
85
|
-
&& bundle install --jobs 4 --retry 3
|
86
|
-
|
87
|
-
&& echo 'Clearing logs and tmp dirs'
|
88
|
-
&& bundle exec rake log:clear tmp:clear
|
150
|
+
&& time bundle install --jobs 4 --retry 3
|
89
151
|
|
90
152
|
&& echo 'Check and wait for database connection'
|
91
|
-
&& bundle exec docker-rails db_check mysql
|
153
|
+
&& time bundle exec docker-rails db_check mysql
|
92
154
|
|
93
|
-
&& echo '
|
94
|
-
&& bundle exec rake
|
155
|
+
&& echo 'DB rebuild'
|
156
|
+
&& time bundle exec rake db:rebuild_test[true]
|
95
157
|
|
96
|
-
&& echo 'Tests'
|
97
158
|
&& cd ../..
|
98
|
-
&&
|
159
|
+
&& echo 'Tests'
|
160
|
+
&& time xvfb-run -a bundle exec rake parallel:spec parallel:features
|
99
161
|
"
|
100
162
|
|
101
163
|
staging:
|
@@ -109,13 +171,13 @@ staging:
|
|
109
171
|
echo 'Bundling gems'
|
110
172
|
&& bundle install --jobs 4 --retry 3
|
111
173
|
|
112
|
-
&& echo 'Clearing logs
|
113
|
-
&& bundle exec rake log:clear
|
174
|
+
&& echo 'Clearing logs'
|
175
|
+
&& bundle exec rake log:clear
|
114
176
|
|
115
177
|
&& echo 'Check and wait for database connection'
|
116
178
|
&& bundle exec docker-rails db_check mysql
|
117
179
|
|
118
|
-
&& echo '
|
180
|
+
&& echo 'DB rebuild'
|
119
181
|
&& bundle exec rake db:migrate
|
120
182
|
|
121
183
|
&& echo "Starting app server"
|
@@ -125,35 +187,27 @@ staging:
|
|
125
187
|
&& gem install foreman
|
126
188
|
&& foreman start
|
127
189
|
"
|
128
|
-
|
129
190
|
compose:
|
191
|
+
|
130
192
|
web:
|
131
193
|
build: .
|
132
|
-
working_dir: /project
|
194
|
+
working_dir: /project
|
133
195
|
ports:
|
134
196
|
- "3000"
|
135
197
|
|
136
198
|
links:
|
137
199
|
- db
|
138
200
|
|
139
|
-
volumes:
|
140
|
-
- .:/project
|
141
|
-
|
142
|
-
volumes_from:
|
143
|
-
# Mount the gems data volume container for cached bundler gem files
|
144
|
-
- #{DOCKER_RAILS_GEMS_VOLUME_NAME}
|
145
|
-
|
146
|
-
# https://docs.docker.com/v1.6/compose/cli/#environment-variables
|
147
|
-
environment:
|
148
|
-
# Tell bundler where to get the files
|
149
|
-
- GEM_HOME=#{DOCKER_RAILS_GEMS_VOLUME_PATH}
|
150
|
-
|
151
201
|
db:
|
152
202
|
# https://github.com/docker-library/docs/tree/master/mysql
|
153
|
-
image: library/mysql:5.7
|
203
|
+
image: library/mysql:5.7
|
154
204
|
ports:
|
155
205
|
- "3306"
|
156
206
|
|
207
|
+
volumes:
|
208
|
+
- ./db/mysql:/etc/mysql/conf.d
|
209
|
+
# - ./target/mysql/data:/var/lib/mysql
|
210
|
+
|
157
211
|
# https://github.com/docker-library/docs/tree/master/mysql#environment-variables
|
158
212
|
environment:
|
159
213
|
- MYSQL_ALLOW_EMPTY_PASSWORD=true
|
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.6.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-10-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -158,7 +158,7 @@ files:
|
|
158
158
|
- lib/docker/rails.rb
|
159
159
|
- lib/docker/rails/app.rb
|
160
160
|
- lib/docker/rails/cli/db_check.rb
|
161
|
-
- lib/docker/rails/cli/
|
161
|
+
- lib/docker/rails/cli/gemset_volume.rb
|
162
162
|
- lib/docker/rails/cli/main.rb
|
163
163
|
- lib/docker/rails/compose_config.rb
|
164
164
|
- lib/docker/rails/config.rb
|