docker-rails 0.5.6 → 0.6.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/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
|