dockerize-stack 0.5.2 → 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 +25 -23
- data/lib/config.yml +28 -0
- data/lib/dockerize_stack.rb +44 -4
- data/lib/dockerize_stack/rails.rb +23 -20
- data/lib/dockerize_stack/react.rb +9 -11
- data/lib/thor_extend.rb +53 -4
- data/lib/version.rb +1 -1
- data/templates/rails/Dockerfile.erb +27 -9
- data/templates/rails/entrypoint.sh.erb +2 -0
- data/templates/react/dockerignore.erb +27 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 463c73cd30ce0f03ffbdeeffa99db4a7eedda9ac3611bd5c9e7ac8d477cc3d97
|
4
|
+
data.tar.gz: 7ec780a8f81ba600fc3e29a10456c8412c0cdaf8784dd99cb6476c3f86a7db5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5927bd9855ff172132ae13ded16c2b0a77ab46f7d8e5b81cee01fc0e81ca558ad2685ff6691e1b11246b4db8f4d6934bd2113384dd20b7d5137f80c9466489c1
|
7
|
+
data.tar.gz: 7572551ff734743ba341b0b0ea7408018571bacaf502b7e92c2cb341130535e8c58bb36623b446a15c24efd1d8c67103307a657135e3a6f7b75c1628979ff5e7
|
data/README.md
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
-
# Dockerize Stack
|
1
|
+
# Dockerize Stack
|
2
2
|
|
3
|
-
This it's a generator for generate Dockerfile and docker-compose for your application for development
|
3
|
+
This it's a generator for generate Dockerfile and docker-compose for your application for development and production
|
4
4
|
|
5
5
|
## Why?
|
6
6
|
|
7
|
-
|
7
|
+
- Help to configure multiple applications using the same templates.
|
8
8
|
|
9
|
-
|
9
|
+
- For build a quick stack for your development enviroment docker is the best tool you can use, but you need to configure the Dockerfile docker-compose, persisted database data, set the entrypoint...
|
10
|
+
|
11
|
+
- For deploy to kubernetes you need first Dockerfile for your application, this templates help to build optimize docker image for productions enviroments.
|
12
|
+
|
13
|
+
- Using templates is more easy customize docker build process (Dockerfile, docker-compose).
|
10
14
|
|
11
15
|
## Install
|
12
16
|
|
@@ -32,31 +36,29 @@ or use docker image
|
|
32
36
|
docker run --user $(id -u) -it -v $(pwd):/usr/src devmasx/dockerize-stack rails
|
33
37
|
```
|
34
38
|
|
35
|
-
|
39
|
+
## Rails Templates
|
40
|
+
|
41
|
+
[rails example](./examples/rails)
|
42
|
+
|
43
|
+
By default the Dockerfile config is for production enviroment; using docker multistage feature and ARG (Build arguments) at the build time this Dockerfile is the same for development and production.
|
36
44
|
|
37
|
-
|
38
|
-
|
45
|
+
See all options:
|
46
|
+
|
47
|
+
```
|
48
|
+
dockerize-stack help rails
|
49
|
+
```
|
39
50
|
|
40
|
-
|
51
|
+
Build a docker image for development enviroment:
|
41
52
|
|
42
53
|
```
|
43
|
-
|
44
|
-
--
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
----rails
|
49
|
-
------Dockerfile
|
50
|
-
------entrypoint.sh
|
51
|
-
----nginx
|
52
|
-
------Dockerfile
|
53
|
-
------entrypoint.sh
|
54
|
-
/.dockerignore
|
55
|
-
/docker-compose.yml
|
56
|
-
/config/database-docker.yml
|
54
|
+
docker build -t rails-example \
|
55
|
+
--build-arg=BUNDLE_DEPLOYMENT="false" \
|
56
|
+
--build-arg=BUNDLE_WITHOUT="" \
|
57
|
+
--build-arg=NODE_ENV="" \
|
58
|
+
.
|
57
59
|
```
|
58
60
|
|
59
61
|
## TODO
|
60
62
|
|
61
63
|
- [ ] Add integrations with all database types rails new supported ([mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc])
|
62
|
-
- [x] Integrate Build with private
|
64
|
+
- [x] Integrate Build with private repositories
|
data/lib/config.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
rails:
|
2
|
+
defaults:
|
3
|
+
ruby_version: "2.5.6"
|
4
|
+
nodejs_version: "10.16.3"
|
5
|
+
yarn_version: "1.17.3"
|
6
|
+
javascrit_package_manager:
|
7
|
+
- asset_pipeline
|
8
|
+
- yarn
|
9
|
+
- npm
|
10
|
+
database:
|
11
|
+
- postgresql
|
12
|
+
- mysql
|
13
|
+
rails_worker: true
|
14
|
+
github_private: false
|
15
|
+
kubernetes: false
|
16
|
+
questions:
|
17
|
+
ruby_version: "Ruby Version (default 2.5.6):"
|
18
|
+
javascrit_package_manager: What is your Javascript package manager?
|
19
|
+
database: What is your Database?
|
20
|
+
rails_worker: You need workers with sidekiq? y/n, (default y)
|
21
|
+
github_private: You need github token for private gems? y/n (default no)
|
22
|
+
kubernetes: You want generate docker-stack for kubernetes? y/n (default no)'
|
23
|
+
|
24
|
+
react:
|
25
|
+
defaults:
|
26
|
+
nodejs_version: "10.16.3"
|
27
|
+
questions:
|
28
|
+
nodejs_version: "Nodejs version (default 10.16.3):"
|
data/lib/dockerize_stack.rb
CHANGED
@@ -6,17 +6,57 @@ require_relative './dockerize_stack/rails.rb'
|
|
6
6
|
module DockerizeStack
|
7
7
|
class Command < Thor
|
8
8
|
include Thor::Actions
|
9
|
+
include ThorActionsExtend
|
10
|
+
RAILS_CONFIG_DEFAULTS = CONFIG.dig(:rails, :defaults)
|
11
|
+
|
12
|
+
option :template_folder,
|
13
|
+
aliases: 't',
|
14
|
+
desc: 'Template folder path'
|
15
|
+
option :output_folder,
|
16
|
+
default: '.',
|
17
|
+
aliases: 'o',
|
18
|
+
desc: 'Output folder'
|
19
|
+
option :ruby_version,
|
20
|
+
banner: RAILS_CONFIG_DEFAULTS[:ruby_version],
|
21
|
+
desc: 'Ruby version'
|
22
|
+
option :javascrit_package_manager,
|
23
|
+
banner: 'npm',
|
24
|
+
enum: RAILS_CONFIG_DEFAULTS[:javascrit_package_manager]
|
25
|
+
option :nodejs_version,
|
26
|
+
banner: RAILS_CONFIG_DEFAULTS[:nodejs_version],
|
27
|
+
desc: 'Nodejs version'
|
28
|
+
option :yarn_version,
|
29
|
+
banner: RAILS_CONFIG_DEFAULTS[:yarn_version],
|
30
|
+
desc: 'Yarn version'
|
31
|
+
option :database,
|
32
|
+
banner: 'postgresql',
|
33
|
+
enum: RAILS_CONFIG_DEFAULTS[:database],
|
34
|
+
desc: 'Database type'
|
35
|
+
option :rails_worker,
|
36
|
+
type: :boolean,
|
37
|
+
banner: RAILS_CONFIG_DEFAULTS[:rails_worker],
|
38
|
+
desc: 'Rails sidekiq examples in docker-compose.yml'
|
39
|
+
option :github_private,
|
40
|
+
type: :boolean,
|
41
|
+
banner: RAILS_CONFIG_DEFAULTS[:github_private],
|
42
|
+
desc: 'Set GITHUB_USERNAME and GITHUB_TOKEN in dockerfile bundle config'
|
43
|
+
option :kubernetes,
|
44
|
+
type: :boolean,
|
45
|
+
banner: RAILS_CONFIG_DEFAULTS[:kubernetes],
|
46
|
+
desc: 'Basic examples for kubernetes config (minikube)'
|
9
47
|
|
10
|
-
option :path
|
11
48
|
desc 'rails', 'generate docker files for rails application'
|
12
49
|
def rails
|
13
|
-
DockerizeStack::Rails.new.
|
50
|
+
DockerizeStack::Rails.new.run(options)
|
14
51
|
end
|
15
52
|
|
16
|
-
option :path
|
53
|
+
option :template_folder, aliases: 't', desc: 'Template folder path'
|
54
|
+
option :output_folder, default: '.', aliases: 'o', desc: 'Output folder'
|
55
|
+
option :nodejs_version, banner: '10.16.3', dec: 'Nodejs version'
|
56
|
+
|
17
57
|
desc 'react', 'generate docker files for create react app'
|
18
58
|
def react
|
19
|
-
DockerizeStack::React.new.
|
59
|
+
DockerizeStack::React.new.run(options)
|
20
60
|
end
|
21
61
|
end
|
22
62
|
end
|
@@ -4,27 +4,30 @@ module DockerizeStack
|
|
4
4
|
include Thor::Actions
|
5
5
|
include ThorActionsExtend
|
6
6
|
|
7
|
-
attr_accessor :ruby_version, :
|
8
|
-
|
9
|
-
|
10
|
-
def self.source_root
|
11
|
-
"#{File.dirname(__FILE__)}/../../templates/rails"
|
12
|
-
end
|
7
|
+
attr_accessor :ruby_version, :javascrit_package_manager, :nodejs_version,
|
8
|
+
:yarn_version, :database, :github_private, :kubernetes, :output_folder
|
13
9
|
|
14
10
|
no_commands do
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
11
|
+
def template_type
|
12
|
+
:rails
|
13
|
+
end
|
14
|
+
|
15
|
+
def run(options)
|
16
|
+
super(options)
|
17
|
+
render_kubernetes_templates if @kubernetes
|
18
|
+
end
|
19
|
+
|
20
|
+
def fetch_template_variables
|
21
|
+
@output_folder = with_default(:output_folder)
|
22
|
+
@nodejs_version = with_default(:nodejs_version)
|
23
|
+
@yarn_version = with_default(:yarn_version)
|
24
|
+
|
25
|
+
@ruby_version = ask_with_default(:ruby_version)
|
26
|
+
@javascrit_package_manager = ask_with_options(:javascrit_package_manager)
|
27
|
+
@database = ask_with_options(:database)
|
28
|
+
@rails_worker = ask_with_default_boolean(:rails_worker)
|
29
|
+
@github_private = ask_with_default_boolean(:github_private)
|
30
|
+
@kubernetes = ask_with_default_boolean(:kubernetes)
|
28
31
|
end
|
29
32
|
|
30
33
|
def render_templates
|
@@ -38,7 +41,7 @@ module DockerizeStack
|
|
38
41
|
end
|
39
42
|
|
40
43
|
def render_kubernetes_templates
|
41
|
-
directory 'kubernetes', "#{@
|
44
|
+
directory 'kubernetes', "#{@output_folder}/kubernetes"
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
@@ -6,25 +6,23 @@ module DockerizeStack
|
|
6
6
|
include Thor::Actions
|
7
7
|
include ThorActionsExtend
|
8
8
|
|
9
|
-
attr_accessor :nodejs_version, :
|
10
|
-
|
11
|
-
def self.source_root
|
12
|
-
"#{File.dirname(__FILE__)}/../../templates/react"
|
13
|
-
end
|
9
|
+
attr_accessor :nodejs_version, :output_folder
|
14
10
|
|
15
11
|
no_commands do
|
16
|
-
def
|
17
|
-
|
18
|
-
|
12
|
+
def template_type
|
13
|
+
:react
|
14
|
+
end
|
19
15
|
|
20
|
-
|
16
|
+
def fetch_template_variables
|
17
|
+
@output_folder = with_default(:output_folder)
|
18
|
+
@nodejs_version = ask_with_default(:nodejs_version)
|
21
19
|
end
|
22
20
|
|
23
21
|
def render_templates
|
24
22
|
render_template 'Dockerfile.erb'
|
25
|
-
render_template '
|
23
|
+
render_template 'dockerignore.erb', '.dockerignore'
|
26
24
|
|
27
|
-
directory 'nginx', "#{@
|
25
|
+
directory 'nginx', "#{@output_folder}/nginx"
|
28
26
|
end
|
29
27
|
end
|
30
28
|
end
|
data/lib/thor_extend.rb
CHANGED
@@ -1,14 +1,63 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'json'
|
3
|
+
|
1
4
|
module ThorActionsExtend
|
2
5
|
include Thor::Actions
|
3
6
|
|
7
|
+
CONFIG = JSON.parse(
|
8
|
+
JSON.dump(YAML.load_file("#{File.dirname(__FILE__)}/config.yml")),
|
9
|
+
symbolize_names: true
|
10
|
+
)
|
11
|
+
def run(options)
|
12
|
+
@template_type = template_type
|
13
|
+
@options = options
|
14
|
+
@config = CONFIG[@template_type]
|
15
|
+
self.class.source_root(template_folder(@template_type.to_s))
|
16
|
+
|
17
|
+
fetch_template_variables
|
18
|
+
render_templates
|
19
|
+
end
|
20
|
+
|
4
21
|
private
|
22
|
+
|
23
|
+
def template_folder(template_type)
|
24
|
+
@options[:template_folder] || "#{File.dirname(__FILE__)}/../templates/#{template_type}"
|
25
|
+
end
|
26
|
+
|
5
27
|
def render_template(path, target_path = path)
|
6
|
-
template path, "#{@
|
28
|
+
template path, "#{@output_folder}/#{target_path.gsub('.erb', '')}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def with_default(option)
|
32
|
+
return @config[:defaults][option] if @options[option].nil?
|
33
|
+
|
34
|
+
@options[option]
|
7
35
|
end
|
8
36
|
|
9
|
-
def ask_with_default(
|
10
|
-
|
11
|
-
|
37
|
+
def ask_with_default(option, default = nil)
|
38
|
+
return @options[option] unless @options[option].nil?
|
39
|
+
|
40
|
+
default = @config[:defaults][option] if default.nil?
|
41
|
+
result = ask(@config[:questions][option])
|
42
|
+
|
43
|
+
result == '' ? default : result
|
44
|
+
end
|
45
|
+
|
46
|
+
def ask_with_options(option, limited_to = nil)
|
47
|
+
return @options[option] if @options[option]
|
48
|
+
|
49
|
+
limited_to = @config[:defaults][option] if limited_to.nil?
|
50
|
+
ask(@config[:questions][option], limited_to: limited_to)
|
51
|
+
end
|
52
|
+
|
53
|
+
def ask_with_default_boolean(option)
|
54
|
+
return @options[option] unless @options[option].nil?
|
55
|
+
|
56
|
+
result = ask(@config[:questions][option])
|
57
|
+
default = @config[:defaults][option] if default.nil?
|
58
|
+
return default if result == ''
|
59
|
+
|
60
|
+
%w[yes y true].include?(result) ? true : false
|
12
61
|
end
|
13
62
|
|
14
63
|
def append_or_create(file_path, file_content)
|
data/lib/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# ****************************
|
2
2
|
# ******Build base stage******
|
3
3
|
# ****************************
|
4
|
-
|
4
|
+
<% if javascrit_package_manager != "asset_pipeline" %>
|
5
5
|
FROM node:<%= nodejs_version %>-slim as nodejs
|
6
|
-
|
6
|
+
<% end %>
|
7
7
|
FROM ruby:<%= ruby_version %>-slim as builder
|
8
8
|
|
9
9
|
# Install common libs
|
@@ -16,12 +16,18 @@ RUN apt-get install -y mysql-client libmysqlclient-dev
|
|
16
16
|
# Install Postgresql
|
17
17
|
RUN apt-get install -y postgresql-client libpq-dev
|
18
18
|
<% end %>
|
19
|
-
# Install Nodejs
|
19
|
+
# Install Nodejs<% if javascrit_package_manager == "asset_pipeline" %>
|
20
|
+
RUN apt-get install -y nodejs npm
|
21
|
+
<% elsif javascrit_package_manager == "yarn" %>
|
20
22
|
ENV NODE_VERSION=<%= nodejs_version %> YARN_VERSION=<%= yarn_version %>
|
21
23
|
COPY --from=nodejs /usr/local/bin/ /usr/local/bin/
|
22
24
|
COPY --from=nodejs /usr/local/lib/ /usr/local/lib/
|
23
25
|
COPY --from=nodejs /opt/yarn-v<%= yarn_version %>/ /opt/yarn-v<%= yarn_version %>/
|
24
|
-
|
26
|
+
<% elsif javascrit_package_manager == "npm" %>
|
27
|
+
ENV NODE_VERSION=<%= nodejs_version %>
|
28
|
+
COPY --from=nodejs /usr/local/bin/ /usr/local/bin/
|
29
|
+
COPY --from=nodejs /usr/local/lib/ /usr/local/lib/
|
30
|
+
<% end %>
|
25
31
|
WORKDIR /app
|
26
32
|
<% if @github_private == 'yes' %>
|
27
33
|
# Private repository
|
@@ -29,7 +35,6 @@ ARG GITHUB_TOKEN
|
|
29
35
|
ARG GITHUB_USERNAME
|
30
36
|
RUN bundle config github.com ${GITHUB_USERNAME}:${GITHUB_TOKEN}
|
31
37
|
<% end %>
|
32
|
-
|
33
38
|
# Production config
|
34
39
|
ARG BUNDLE_DEPLOYMENT=true
|
35
40
|
ARG BUNDLE_WITHOUT="development test staging"
|
@@ -41,11 +46,16 @@ ENV NODE_ENV=$NODE_ENV
|
|
41
46
|
# Gems cache layer
|
42
47
|
COPY Gemfile Gemfile.lock /app/
|
43
48
|
RUN bundle install -j 4
|
44
|
-
|
49
|
+
<% if javascrit_package_manager == "yarn" %>
|
45
50
|
# Node modules cache layer
|
46
51
|
COPY package.json yarn.lock /app/
|
47
52
|
RUN yarn install --pure-lockfile
|
48
|
-
|
53
|
+
<% elsif javascrit_package_manager == "npm" %>
|
54
|
+
# Node modules cache layer
|
55
|
+
COPY package.json package-lock.json /app/
|
56
|
+
RUN npm ci
|
57
|
+
<% elsif javascrit_package_manager == "asset_pipeline" %>
|
58
|
+
<% end %>
|
49
59
|
COPY . .
|
50
60
|
CMD "./entrypoint.sh"
|
51
61
|
|
@@ -57,8 +67,9 @@ FROM builder as production-builder
|
|
57
67
|
|
58
68
|
# Build production assets
|
59
69
|
RUN bundle exec rails assets:precompile
|
70
|
+
<% if javascrit_package_manager != "asset_pipeline" %>
|
60
71
|
RUN rm -r node_modules
|
61
|
-
|
72
|
+
<% end %>
|
62
73
|
# **********************************
|
63
74
|
# ******Final production Stage******
|
64
75
|
# **********************************
|
@@ -68,11 +79,18 @@ FROM ruby:<%= ruby_version %>-slim
|
|
68
79
|
ENV NODE_ENV=production RAILS_ENV=production RAILS_LOG_TO_STDOUT=true
|
69
80
|
|
70
81
|
# Install system dependencies
|
82
|
+
<% if javascrit_package_manager != "asset_pipeline" %>
|
71
83
|
COPY --from=nodejs /usr/local/ /usr/local/
|
84
|
+
<% end %><% if javascrit_package_manager == "asset_pipeline" %>
|
72
85
|
RUN apt-get update -qq && apt-get install -y \
|
73
86
|
libpq-dev \
|
87
|
+
nodejs \
|
74
88
|
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
75
|
-
|
89
|
+
<% else %>
|
90
|
+
RUN apt-get update -qq && apt-get install -y \
|
91
|
+
libpq-dev \
|
92
|
+
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
93
|
+
<% end %>
|
76
94
|
WORKDIR /app
|
77
95
|
|
78
96
|
RUN groupadd -r deploy && useradd -r -g deploy deploy
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
2
|
+
# echo .git > .dockerignore && cat .gitignore >> .dockerignore
|
3
|
+
|
4
|
+
.git
|
5
|
+
Dockerfile
|
6
|
+
|
7
|
+
# dependencies
|
8
|
+
/node_modules
|
9
|
+
/.pnp
|
10
|
+
.pnp.js
|
11
|
+
|
12
|
+
# testing
|
13
|
+
/coverage
|
14
|
+
|
15
|
+
# production
|
16
|
+
/build
|
17
|
+
|
18
|
+
# misc
|
19
|
+
.DS_Store
|
20
|
+
.env.local
|
21
|
+
.env.development.local
|
22
|
+
.env.test.local
|
23
|
+
.env.production.local
|
24
|
+
|
25
|
+
npm-debug.log*
|
26
|
+
yarn-debug.log*
|
27
|
+
yarn-error.log*
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dockerize-stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miguel Savignano
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- LICENSE
|
35
35
|
- README.md
|
36
36
|
- bin/dockerize-stack
|
37
|
+
- lib/config.yml
|
37
38
|
- lib/dockerize_stack.rb
|
38
39
|
- lib/dockerize_stack/rails.rb
|
39
40
|
- lib/dockerize_stack/react.rb
|
@@ -60,6 +61,7 @@ files:
|
|
60
61
|
- templates/rails/nginx/etc/nginx/conf.d/default.conf
|
61
62
|
- templates/rails/nginx/etc/nginx/nginx.conf
|
62
63
|
- templates/react/Dockerfile.erb
|
64
|
+
- templates/react/dockerignore.erb
|
63
65
|
- templates/react/nginx/conf.d/default.conf.template
|
64
66
|
homepage: https://github.com/MiguelSavignano/dockerize-stack
|
65
67
|
licenses:
|
@@ -80,8 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
82
|
- !ruby/object:Gem::Version
|
81
83
|
version: '0'
|
82
84
|
requirements: []
|
83
|
-
|
84
|
-
rubygems_version: 2.7.9
|
85
|
+
rubygems_version: 3.0.3
|
85
86
|
signing_key:
|
86
87
|
specification_version: 4
|
87
88
|
summary: DockerizeStack
|