-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathRakefile
More file actions
72 lines (55 loc) · 2.02 KB
/
Copy pathRakefile
File metadata and controls
72 lines (55 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
require 'rake'
$output_files = FileList['*/**/Dockerfile'].pathmap('.build/%X.dimg')
def output_files_for(file)
$output_files.select { |f| /#{file}/.match(f) }
end
def output_file_for(file)
$output_files.detect { |f| /#{file}/.match(f) }
end
task default: :all
desc 'Builds the base image, BEWARE will love you long time'
task base: output_file_for('base/')
namespace :services do
desc 'Builds all service images'
task all: [:base, *output_files_for('services/')]
services = FileList['services/*/'].pathmap('%{^services/,}X').pathmap('%{/$,}X')
services.each do |svc|
desc "Builds an image for #{svc}"
task svc.to_sym => [:base, output_file_for("services/#{svc}")]
end
end
namespace :development do
desc 'Builds an image for express development'
task express: [:base, output_file_for('development/express')]
desc 'Builds a base image for rails development'
task rails_base: [:base, output_file_for('development/rails_base')]
desc 'Builds an image for rails development that includes PostgreSQL'
task rails: [:base, :rails_base, output_file_for('development/rails')]
desc 'Builds an image for rails development that includes MySQL'
task rails_mysql: [:base, :rails_base, output_file_for('development/rails_mysql')]
desc 'Builds all development images'
task all: [:express, :rails, :rails_mysql]
end
desc 'Builds all images in dependency order.'
task all: [:base, 'services:all', 'development:all']
def image_name(src_file)
dirs = src_file.pathmap('%d').split('/')
name = dirs[0]
if dirs[0] == 'development'
name = dirs[-1]
elsif dirs[0] == 'services'
name = "#{dirs[-2]}:#{dirs[-1]}"
end
name
end
def build_image(name, src_dir, out_dir)
sh "docker build -t erickbrower/#{name} #{src_dir} && touch #{out_dir}/Dockerfile.dimg"
end
def source_files_for(file)
FileList[file.pathmap('%{^\.build/,}d/**/*')]
end
rule '.dimg' => ->(f) { source_files_for(f) } do |t|
out_dir = t.name.pathmap '%d'
mkdir_p out_dir
build_image image_name(t.source), t.source.pathmap('%d'), out_dir
end