dockerize-stack 0.5.2 → 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 +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
|