dockrails 1.0.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 +7 -0
- data/LICENSE +22 -0
- data/bin/dockrails +95 -0
- data/lib/dockrails.rb +2 -0
- data/lib/dockrails/generate.rb +192 -0
- data/lib/dockrails/version.rb +3 -0
- metadata +77 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2f5568873ad53a84d13c5a2d2f500a61091516ee
|
4
|
+
data.tar.gz: eaa4edcea9f1a27b523429b36ea3417b85253be5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6ff9801d88d448337b7c159adeda7cd72179ad93410f1d0a2b81e524d590e96df076566efc57edbc36a3d256028cfce26f1b06680eeab54c355b5ff84d37300b
|
7
|
+
data.tar.gz: be8d7428bb39d486b79aa8620e857dda836a96706bebf81b30ff93e0bfbc0bb0428bb343ddd07dea1a2a5d1acdd37f26bf866dc4a78cdef7498b6f1ff67a212d
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2017 Guillaume Montard
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/dockrails
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'commander/import'
|
5
|
+
require 'dockrails'
|
6
|
+
|
7
|
+
program :name, 'dockrails'
|
8
|
+
program :version, Dockrails::VERSION
|
9
|
+
program :description, 'CLI to generate and Run a Rails environment with Docker'
|
10
|
+
|
11
|
+
command :init do |c|
|
12
|
+
c.syntax = 'railsdock init'
|
13
|
+
c.summary = 'Initialize your Rails Docker environment'
|
14
|
+
c.description = ''
|
15
|
+
c.example 'description', 'railsdock init'
|
16
|
+
c.action do |args, options|
|
17
|
+
|
18
|
+
existing_files = ["Dockerfile", "docker-compose.yml", "docker-sync.yml"].map { |file| File.exist?(file) }
|
19
|
+
if existing_files.include?(true)
|
20
|
+
say "We detected an existing Docker install in this folder"
|
21
|
+
answer = agree "Do you want to continue and override it?"
|
22
|
+
exit if !answer
|
23
|
+
end
|
24
|
+
|
25
|
+
rails_app = ask "\nType the name of your Rails App folder"
|
26
|
+
if !system("find #{rails_app} > /dev/null")
|
27
|
+
say "\nUnable to find your Rails application folder in the current path, please try again"
|
28
|
+
say "If you want to create a new Rails app: rails new my_app -B -d postgresql"
|
29
|
+
exit
|
30
|
+
end
|
31
|
+
|
32
|
+
generate = Dockrails::Generate.new(app_path: rails_app)
|
33
|
+
generate.create_folders
|
34
|
+
generate.create_dockerfile
|
35
|
+
generate.create_start_script
|
36
|
+
generate.create_docker_compose
|
37
|
+
generate.create_docker_sync
|
38
|
+
|
39
|
+
say "\nSuccessful dockerization!
|
40
|
+
Please take a look at the different files generated:
|
41
|
+
- Dockerfile
|
42
|
+
- docker-compose.yml
|
43
|
+
- docker-sync.yml"
|
44
|
+
|
45
|
+
say "\nStart your dockerized Rails Environement: railsdock start"
|
46
|
+
say "Familiarize yourself with the different commands: railsdock --help"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
command :start do |c|
|
51
|
+
c.syntax = 'railsdock start'
|
52
|
+
c.summary = 'Start the docker stack containers'
|
53
|
+
c.description = ''
|
54
|
+
c.example 'description', 'railsdock start'
|
55
|
+
c.action do |args, options|
|
56
|
+
system("docker-sync-stack start")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
command :clean do |c|
|
61
|
+
c.syntax = 'railsdock clean'
|
62
|
+
c.summary = 'Clean the docker stack containers'
|
63
|
+
c.description = ''
|
64
|
+
c.example 'description', 'railsdock clean'
|
65
|
+
c.action do |args, options|
|
66
|
+
system("docker-sync-stack clean")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
command :run do |c|
|
71
|
+
c.syntax = 'railsdock run [container] [command]'
|
72
|
+
c.summary = 'Run a command on a specific container'
|
73
|
+
c.description = ''
|
74
|
+
c.example 'description', 'railsdock run [web|job|db|redis] bundle install'
|
75
|
+
c.action do |args, options|
|
76
|
+
if args.size < 2
|
77
|
+
say "\n Please specify a container and command to run, ex: railsdock run app bundle install"
|
78
|
+
else
|
79
|
+
system("docker-compose run #{args.join(" ")}")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
command :attach do |c|
|
85
|
+
c.syntax = 'railsdock attach [container]'
|
86
|
+
c.summary = 'Attach TTY to a specific container (usefull for ByeBug or Pry)'
|
87
|
+
c.description = 'toto'
|
88
|
+
c.action do |args, options|
|
89
|
+
if args.size < 1
|
90
|
+
say "\n Please specify a container, ex: railsdock attach app"
|
91
|
+
else
|
92
|
+
system("docker attach $(docker-compose ps -q #{args[0]})")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/dockrails.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
module Dockrails
|
2
|
+
class Generate
|
3
|
+
|
4
|
+
def initialize(app_path:)
|
5
|
+
check_system_requirements
|
6
|
+
@app_path = app_path
|
7
|
+
@config = ask_configuration
|
8
|
+
end
|
9
|
+
|
10
|
+
def check_system_requirements
|
11
|
+
requirement = Hash.new
|
12
|
+
requirement["unison"] = system("which unison > /dev/null")
|
13
|
+
requirement["docker"] = system("which docker > /dev/null")
|
14
|
+
requirement["docker-sync"] = system("which docker-sync > /dev/null")
|
15
|
+
requirement["docker-compose"] = system("which docker-compose > /dev/null")
|
16
|
+
|
17
|
+
requirement.each do |k,v|
|
18
|
+
if v == false
|
19
|
+
say "please install \"#{k}\" in order to continue\n"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ask_configuration
|
25
|
+
config = Hash.new
|
26
|
+
config["ruby-version"] = choose("\nChoose a ruby version?", "latest", "2.4", "2.3", "2.2")
|
27
|
+
config["db"] = choose("\nChoose a DB Engine?", :pgsql, :mysql)
|
28
|
+
config["db_name"] = ask "\nChoose a database name"
|
29
|
+
config["db_user"] = ask "\nChoose a database username"
|
30
|
+
config["db_password"] = ask "\nChoose a database password"
|
31
|
+
config["redis"] = agree("\nDo you need a Redis DB?")
|
32
|
+
config["sidekiq"] = agree("\nDo you need a SideKiq Container") if config["redis"]
|
33
|
+
|
34
|
+
user_agree = agree "\nSummary:
|
35
|
+
- Ruby version: #{config["ruby-version"]}
|
36
|
+
- DB Engine: #{config["db"]}
|
37
|
+
- DB Name: #{config["db_name"]}
|
38
|
+
- DB Username: #{config["db_user"]}
|
39
|
+
- DB Password: #{config["db_password"]}
|
40
|
+
- Redis? #{config["redis"]}
|
41
|
+
- Job Container? #{config["sidekiq"] ||= "false"}\n
|
42
|
+
Is this correct?"
|
43
|
+
|
44
|
+
unless user_agree
|
45
|
+
ask_configuration
|
46
|
+
end
|
47
|
+
|
48
|
+
return(config)
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_folders
|
52
|
+
system("rm -rf data")
|
53
|
+
system("mkdir -p data/sql")
|
54
|
+
system("mkdir -p data/redis") if @config["redis"]
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_dockerfile
|
58
|
+
File.open("Dockerfile", 'w') do |f|
|
59
|
+
f.write("FROM ruby:#{@config["ruby-version"]}
|
60
|
+
RUN apt-get update && apt-get install -y \
|
61
|
+
build-essential \
|
62
|
+
wget \
|
63
|
+
git-core \
|
64
|
+
libxml2 \
|
65
|
+
libxml2-dev \
|
66
|
+
libxslt1-dev \
|
67
|
+
nodejs \
|
68
|
+
imagemagick \
|
69
|
+
libmagickcore-dev \
|
70
|
+
libmagickwand-dev \
|
71
|
+
libpq-dev \
|
72
|
+
&& rm -rf /var/lib/apt/lists/*
|
73
|
+
|
74
|
+
RUN mkdir /app
|
75
|
+
RUN mkdir -p /root/.ssh/
|
76
|
+
|
77
|
+
WORKDIR /app
|
78
|
+
|
79
|
+
RUN ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
80
|
+
ENV GEM_HOME /bundle
|
81
|
+
ENV PATH $GEM_HOME/bin:$PATH
|
82
|
+
ENV BUNDLE_PATH /bundle
|
83
|
+
ENV BUNDLE_BIN /bundle/
|
84
|
+
RUN gem install bundler -v '1.10.6' \
|
85
|
+
&& bundle config --global path \"$GEM_HOME\" \
|
86
|
+
&& bundle config --global bin \"$GEM_HOME/bin\"")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_start_script
|
91
|
+
system("mkdir -p #{@app_path}/scripts")
|
92
|
+
File.open("#{@app_path}/scripts/start-dev.sh", "w") do |f|
|
93
|
+
f.write("#!/bin/bash
|
94
|
+
bundle check || bundle install
|
95
|
+
rm -rf tmp/pids/* && bundle exec rails server --port 3000 --binding 0.0.0.0")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def create_docker_compose
|
100
|
+
File.open("docker-compose.yml", 'w') do |f|
|
101
|
+
f.write "version: '2'\n"
|
102
|
+
f.write "services:\n"
|
103
|
+
f.write " db:\n"
|
104
|
+
|
105
|
+
case @config["db"] when :mysql
|
106
|
+
f.write " image: mysql\n"
|
107
|
+
f.write " volumes:\n"
|
108
|
+
f.write " - ./data/sql:/var/lib/mysql\n"
|
109
|
+
f.write " ports:\n"
|
110
|
+
f.write " - \"3306:3306\"\n"
|
111
|
+
f.write " environment:\n"
|
112
|
+
f.write " MYSQL_DATABASE: #{@config["db_name"]}\n"
|
113
|
+
f.write " MYSQL_USER: #{@config["db_user"]}\n"
|
114
|
+
f.write " MYSQL_PASSWORD: #{@config["db_password"]}\n"
|
115
|
+
f.write " MYSQL_ROOT_PASSWORD: #{@config["db_password"]}\n"
|
116
|
+
when :pgsql
|
117
|
+
f.write " image: postgres\n"
|
118
|
+
f.write " volumes:\n"
|
119
|
+
f.write " - ./data/sql:/var/lib/postgresql/data\n"
|
120
|
+
f.write " ports:\n"
|
121
|
+
f.write " - \"5432:5432\"\n"
|
122
|
+
f.write " environment:\n"
|
123
|
+
f.write " POSTGRES_DB: #{@config["db_name"]}\n"
|
124
|
+
f.write " POSTGRES_USER: #{@config["db_user"]}\n"
|
125
|
+
f.write " POSTGRES_PASSWORD: #{@config["db_password"]}\n"
|
126
|
+
end
|
127
|
+
|
128
|
+
if @config["redis"]
|
129
|
+
f.write "\n redis:\n"
|
130
|
+
f.write " image: redis\n"
|
131
|
+
f.write " volumes:\n"
|
132
|
+
f.write " - ./data/redis:/data\n"
|
133
|
+
f.write " ports:\n"
|
134
|
+
f.write " - \"6379:6379\"\n"
|
135
|
+
end
|
136
|
+
|
137
|
+
f.write "\n web:\n"
|
138
|
+
f.write " build: .\n"
|
139
|
+
f.write " command: sh scripts/start-dev.sh\n"
|
140
|
+
f.write " volumes:\n"
|
141
|
+
f.write " - #{@app_path}-web-sync:/app:rw\n"
|
142
|
+
f.write " - #{@app_path}-bundle-sync:/bundle:rw\n"
|
143
|
+
f.write " - ./keys:/root/.ssh/\n"
|
144
|
+
f.write " ports:\n"
|
145
|
+
f.write " - \"3000:3000\"\n"
|
146
|
+
f.write " environment:\n"
|
147
|
+
f.write " REDIS_URL: redis://redis:6379\n" if @config["redis"]
|
148
|
+
f.write " DB_USER: #{@config["db_user"]}\n"
|
149
|
+
f.write " DB_PASSWORD: #{@config["db_password"]}\n"
|
150
|
+
f.write " links:\n"
|
151
|
+
f.write " - db\n"
|
152
|
+
f.write " - redis\n" if @config["redis"]
|
153
|
+
f.write " tty: true\n"
|
154
|
+
f.write " stdin_open: true\n"
|
155
|
+
|
156
|
+
if @config["redis"] && @config["sidekiq"]
|
157
|
+
f.write "\n job:\n"
|
158
|
+
f.write " build: .\n"
|
159
|
+
f.write " command: bundle exec sidekiq -C config/sidekiq.yml\n"
|
160
|
+
f.write " volumes:\n"
|
161
|
+
f.write " - #{@app_path}-web-sync:/app:rw\n"
|
162
|
+
f.write " - #{@app_path}-bundle-sync:/bundle:rw\n"
|
163
|
+
f.write " - ./keys:/root/.ssh/\n"
|
164
|
+
f.write " environment:\n"
|
165
|
+
f.write " REDIS_URL: redis://redis:6379\n"
|
166
|
+
f.write " links:\n"
|
167
|
+
f.write " - db\n"
|
168
|
+
f.write " - redis\n"
|
169
|
+
end
|
170
|
+
|
171
|
+
f.write "\nvolumes:\n"
|
172
|
+
f.write " #{@app_path}-web-sync:\n"
|
173
|
+
f.write " external: true\n"
|
174
|
+
f.write " #{@app_path}-bundle-sync:\n"
|
175
|
+
f.write " external: true\n"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def create_docker_sync
|
180
|
+
File.open("docker-sync.yml", 'w') do |f|
|
181
|
+
f.write "version: '2'\n"
|
182
|
+
f.write "syncs:\n"
|
183
|
+
f.write " #{@app_path}-web-sync:\n"
|
184
|
+
f.write " src: './#{@app_path}'\n"
|
185
|
+
f.write " dest: '/app'\n"
|
186
|
+
f.write " #{@app_path}-bundle-sync:\n"
|
187
|
+
f.write " src: './bundle'\n"
|
188
|
+
f.write " dest: '/bundle'\n"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dockrails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guillaume Montard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: commander
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: docker-sync
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.3
|
41
|
+
description: Docker + Rails + Mac + Dev = <3
|
42
|
+
email:
|
43
|
+
executables:
|
44
|
+
- dockrails
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- LICENSE
|
49
|
+
- bin/dockrails
|
50
|
+
- lib/dockrails.rb
|
51
|
+
- lib/dockrails/generate.rb
|
52
|
+
- lib/dockrails/version.rb
|
53
|
+
homepage: https://github.com/gmontard/dockrails/
|
54
|
+
licenses:
|
55
|
+
- MIT
|
56
|
+
metadata: {}
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 2.0.0
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.5.2
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Simple CLI to Generate and Run a Rails environment with Docker!
|
77
|
+
test_files: []
|