dockerun 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,173 @@
1
+
2
+ require_relative 'cli_prompt'
3
+ require_relative 'docker_command_factory_helper'
4
+
5
+ module Dockerun
6
+ module CommandHelper
7
+ module DockerImageHelper
8
+ include CliHelper::CliPrompt
9
+ include DockerCommandFactoryHelper
10
+
11
+ class DockerfileNotExist < StandardError; end
12
+ class DockerImageBuildFailed < StandardError; end
13
+ class DockerImageDeleteFailed < StandardError; end
14
+
15
+ def load_dockerfile(root = Dir.getwd)
16
+
17
+ df = Dir.glob(File.join(root,"Dockerfile*"))
18
+ if df.length == 0
19
+ raise DockerfileNotExist, "Dockerfile not yet available. Please create one or run init first."
20
+ end
21
+
22
+ selectedDf = nil
23
+ if df.length > 1
24
+ selectedDf = cli.select("Please select one of the Dockerfile to proceed: ") do |m|
25
+ df.each do |d|
26
+ m.choice File.basename(d), d
27
+ end
28
+ end
29
+ else
30
+ selectedDf = df.first
31
+ end
32
+
33
+ selectedDf
34
+
35
+ end
36
+
37
+ def build_image_if_not_exist(name, &block)
38
+
39
+ raise DockerImageBuildFailed, "block is required" if not block
40
+
41
+ if is_empty?(name)
42
+ reuse = false
43
+ loop do
44
+ name = block.call(:new_image_name)
45
+ break if not is_image_existed?(name)
46
+ reuse, name = block.call(:image_exist, name)
47
+ break if reuse
48
+ end
49
+
50
+ if reuse
51
+
52
+ else
53
+ dockerfile = load_dockerfile(Dir.getwd)
54
+ build_docker_image(name, dockerfile: dockerfile)
55
+ end
56
+
57
+ else
58
+
59
+ if not is_image_existed?(name)
60
+ dockerfile = load_dockerfile(Dir.getwd)
61
+ build_docker_image(name, dockerfile: dockerfile)
62
+ end
63
+
64
+ end
65
+
66
+ name
67
+
68
+ end
69
+
70
+ #def new_image(config, selectedDf)
71
+
72
+ # if not_empty?(selectedDf)
73
+ # imageName = cli.ask("Please provide an image name : ", required: true)
74
+ # res = dcFact.find_image(imageName).run
75
+ # if not res[:result].failed? and not_empty?(res[:outStream])
76
+ # reuse = cli.yes?("Image named '#{imageName}' already exist. Use the existing image? ")
77
+ # if reuse
78
+ # config.image_name = imageName
79
+ # else
80
+ # keep = cli.no?("Remove existing image and create a new image? ")
81
+ # if not keep
82
+ # res = dcFact.delete_image(imageName).run
83
+ # if not res[:result].failed?
84
+ # puts "Existing image with name '#{imageName}' removed."
85
+ # res = dcFact.build_image(imageName, dockerfile: selectedDf).run
86
+ # if not res[:result].failed?
87
+ # config.image_name = imageName
88
+ # else
89
+ # raise DockerImageBuildFailed, "Error while building image '#{imageName}'. Error stream : #{res[:errStream].join(" ")}"
90
+ # end
91
+
92
+ # else
93
+ # raise DockerImageDeleteFailed, "Error while deleting image '#{imageName}'. Error stream : #{res[:errStream].join(" ")}"
94
+ # end
95
+
96
+ # else
97
+ # # user select not to use existing and keep the existing image...
98
+ # # nothing can be done then right?
99
+ # raise Dockerun::Error, "Alreay has existing image with name '#{imageName}' but not reusing the image. System cannot proceed. Please either delete or reuse the image"
100
+ # end
101
+ # end # if reuse or not
102
+
103
+ # else
104
+
105
+ # # no existing image
106
+ # res = dcFact.build_image(imageName, dockerfile: selectedDf).run
107
+ # if res[:result].failed?
108
+ # raise DockerImageBuildFailed, "Error building image '#{imageName}' from dockerfile '#{selectedDf}'. Error was : #{res[:errStream].join(" ")}"
109
+ # end
110
+
111
+ # config.image_name = imageName
112
+
113
+ # end # if image found or not
114
+
115
+ # else
116
+ # # no Dockerfile found
117
+ # raise DockerfileNotExist, "No Dockerfile given. Please make sure there is one or run init first"
118
+ # end # not_empy? selectedDf
119
+
120
+
121
+ #end
122
+
123
+ #def build_image(imageName, selectedDf)
124
+
125
+ # raise DockerImageBuildFailed, "Image name cannot be empty" if is_empty?(imageName)
126
+
127
+ # res = dcFact.find_image(imageName).run
128
+ # if not res[:result].failed? and is_empty?(res[:outStream])
129
+ # # image does not exist
130
+ # res = dcFact.build_image(imageName, dockerfile: selectedDf).run
131
+ # if res[:result].failed?
132
+ # raise DockerImageBuildFailed, "Building image '#{config.image_name}' failed. Error stream : #{res[:errStream].join(" ")}"
133
+ # end
134
+ # end
135
+
136
+ #end
137
+
138
+ private
139
+ def is_image_existed?(name)
140
+ if is_empty?(name)
141
+ false
142
+ else
143
+ res = dcFact.find_image(name).run
144
+ if not res.failed? and res.is_out_stream_empty?
145
+ false
146
+ else
147
+ true
148
+ end
149
+ end
150
+ end
151
+
152
+ def delete_docker_image(name)
153
+ if not_empty?(name)
154
+ res = dcFact.delete_image(name).run
155
+ not res.failed?
156
+ else
157
+ true
158
+ end
159
+ end
160
+
161
+ def build_docker_image(name, opts = { })
162
+ raise DockerImageBuildFailed, "Given name to build docker image is empty" if is_empty?(name)
163
+
164
+ res = dcFact.build_image(name, opts).run
165
+ if res.failed?
166
+ raise DockerImageBuildFailed, "Building image '#{name}' failed. Error stream : #{res.err_stream}"
167
+ end
168
+
169
+ end
170
+
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,14 @@
1
+
2
+ require_relative 'template_writer'
3
+
4
+ module Dockerun
5
+ module Template
6
+ class GeneratlTemplateWriter < TemplateWriter
7
+
8
+ def initialize
9
+ super
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+
2
+ require_relative 'template_writer'
3
+
4
+ module Dockerun
5
+ module Template
6
+ class JrubyTemplateWriter < TemplateWriter
7
+
8
+ def initialize
9
+ super
10
+ end
11
+
12
+ alias_method :find_template, :find_template_super
13
+ def find_template
14
+ case @template
15
+ when "jruby-9.4.0-jdk11"
16
+ @image = "jruby:9.4.0-jdk11"
17
+ end
18
+
19
+ find_template_super
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+
2
+
3
+ module Dockerun
4
+ module Template
5
+ class TemplateEngine
6
+
7
+ def self.template_root
8
+ File.join(File.dirname(__FILE__),"..","..","..","template")
9
+ end
10
+
11
+ def self.available_templates
12
+ avail = Dir.glob(File.join(template_root,"Dockerfile_*.erb"))
13
+ avail.map! { |f|
14
+ name = File.basename(f,".erb")
15
+ name.gsub("Dockerfile_","")
16
+ }
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,63 @@
1
+
2
+ require 'erb'
3
+
4
+ require_relative '../user_info'
5
+
6
+ module Dockerun
7
+ module Template
8
+
9
+ class TemplateWriter
10
+ include UserInfo
11
+
12
+ class TemplateNotFound < StandardError; end
13
+
14
+ attr_accessor :image, :user_group_id, :user_group_name, :user_id, :user_login
15
+
16
+ def self.instance(template)
17
+ tmp = template.to_s.downcase
18
+ if tmp =~ /jruby/
19
+ JrubyTemplateWriter.new
20
+ else
21
+ TemplateWriter.new
22
+ end
23
+ end
24
+
25
+ def initialize(template = :general)
26
+ @template = template
27
+ @image = "<Replace me>"
28
+ user = user_info
29
+ group = group_info
30
+ @maintainer = user[:login]
31
+ @user_group_id = group[:group_id]
32
+ @user_group_name = group[:group_name]
33
+ @user_id = user[:user_id]
34
+ @user_login = user[:login]
35
+ end
36
+
37
+ def compile(&block)
38
+ tmp = find_template
39
+ cont = nil
40
+ File.open(tmp,"r") do |f|
41
+ cont = f.read
42
+ end
43
+
44
+ b = binding
45
+
46
+ res = ERB.new(cont)
47
+ res.result(b)
48
+ end
49
+
50
+ protected
51
+ def find_template
52
+ @template = :general if is_empty?(@template)
53
+
54
+ root = TemplateEngine.template_root
55
+ templateFile = File.join(root,"Dockerfile_#{@template}.erb")
56
+ raise TemplateNotFound, "Given template '#{@template}' could not be found" if not File.exist?(templateFile)
57
+
58
+ templateFile
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,58 @@
1
+
2
+ require 'erb'
3
+
4
+ require_relative '../user_info'
5
+
6
+ module Dockerun
7
+ module Template
8
+
9
+ class TemplateWritter
10
+ include UserInfo
11
+
12
+ class TemplateNotFound < StandardError; end
13
+
14
+ attr_accessor :image, :user_group_id, :user_group_name, :user_id, :user_login
15
+
16
+ def self.instance(template)
17
+
18
+ end
19
+
20
+ def initialize(template = :general)
21
+ @template = template
22
+ @image = "<Replace me>"
23
+ user = user_info
24
+ group = group_info
25
+ @maintainer = user[:login]
26
+ @user_group_id = group[:group_id]
27
+ @user_group_name = group[:group_name]
28
+ @user_id = user[:user_id]
29
+ @user_login = user[:login]
30
+ end
31
+
32
+ def compile(&block)
33
+ tmp = find_template
34
+ cont = nil
35
+ File.open(tmp,"r") do |f|
36
+ cont = f.read
37
+ end
38
+
39
+ b = binding
40
+
41
+ res = ERB.new(cont)
42
+ res.result(b)
43
+ end
44
+
45
+ private
46
+ def find_template
47
+ @template = :general if is_empty?(@template)
48
+
49
+ root = TemplateEngine.template_root
50
+ templateFile = File.join(root,"Dockerfile_#{@template}.erb")
51
+ raise TemplateNotFound, "Given template '#{@template}' could not be found" if not File.exist?(templateFile)
52
+
53
+ templateFile
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,14 @@
1
+
2
+
3
+ module Dockerun
4
+ module Template
5
+ class TemplateEngine
6
+
7
+ def self.available_templates
8
+ path = File.join(File.dirname(__FILE__),"..","..","..","template")
9
+
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+
2
+ require 'etc'
3
+
4
+ module Dockerun
5
+
6
+ module UserInfo
7
+ include TR::CondUtils
8
+
9
+ def user_info(login = nil)
10
+ login = Etc.getlogin if is_empty?(login)
11
+ res = { login: login }
12
+ begin
13
+ res[:user_id] = Etc.getpwnam(login).uid
14
+ rescue Exception => ex
15
+ res[:user_id] = nil
16
+ end
17
+ res
18
+ end
19
+
20
+ def group_info(login = nil)
21
+ login = Etc.getlogin if is_empty?(login)
22
+ res = { }
23
+ begin
24
+ gnm = Etc.getgrnam(login)
25
+ res[:group_name] = gnm.name
26
+ res[:group_id] = gnm.gid
27
+ rescue Exception => ex
28
+ p ex
29
+ res[:group_name] = ""
30
+ res[:group_id] = nil
31
+ end
32
+ res
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dockerun
4
+ VERSION = "0.1.14"
5
+ end
data/lib/dockerun.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'toolrack'
4
+ require 'teLogger'
5
+
6
+ require_relative "dockerun/version"
7
+
8
+ require_relative 'dockerun/command/dockerun'
9
+ require_relative 'dockerun/command/init'
10
+ require_relative 'dockerun/command/run'
11
+ require_relative 'dockerun/command/reset_image'
12
+ require_relative 'dockerun/command/run_new_container'
13
+ require_relative 'dockerun/command/remove_container'
14
+ require_relative 'dockerun/command/run_new_image'
15
+
16
+ require_relative 'dockerun/template/template_writer'
17
+ require_relative 'dockerun/template/template_engine'
18
+
19
+ module Dockerun
20
+ class Error < StandardError; end
21
+ # Your code goes here...
22
+ end
@@ -0,0 +1,12 @@
1
+
2
+ FROM <%= image %>
3
+ LABEL version="0.1" description="Dockerfile generated by dockerun" maintainer="<%= @maintainer %>"
4
+
5
+ # Dockerfile entries here
6
+
7
+ RUN groupadd -f -g <%= @user_group_id %> <%= @user_group_name %> && useradd -u <%= @user_id %> -g <%= @user_group_id %> -m <%= @user_login %>
8
+ USER <%= @user_login %>:<%= @user_group_name %>
9
+
10
+ # ENTRYPOINT [ "/bin/bash" ]
11
+ # CMD [ "/bin/bash", "--login" ]
12
+ CMD [ "/bin/bash", "--login" ]
@@ -0,0 +1,21 @@
1
+
2
+ FROM jruby:9.4.0-jdk11
3
+ LABEL version="0.1" description="Dockerfile generated by dockerun" maintainer="<%= @maintainer %>"
4
+
5
+ RUN apt-get update && apt-get install -y sudo
6
+
7
+ RUN groupadd -f -g <%= @user_group_id %> <%= @user_group_name %> && \
8
+ useradd -u <%= @user_id %> -g <%= @user_group_id %> -m <%= @user_login %> && \
9
+ usermod -aG sudo <%= @user_login %> && \
10
+ echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
11
+
12
+ USER <%= @user_login %>
13
+
14
+ # from this point onwards, sudo is required for privileaged operation
15
+ RUN sudo apt-get install -y curl
16
+
17
+ # other Dockerfile entries starts here
18
+
19
+ # ENTRYPOINT [ "/bin/bash" ]
20
+ # CMD [ "/bin/bash", "--login" ]
21
+ CMD [ "/bin/bash", "--login" ]
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dockerun
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.14
5
+ platform: ruby
6
+ authors:
7
+ - Ian
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-12-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: toolrack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.19.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: teLogger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
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.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-command
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-option
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: docker-cli
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: devops_assist
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: ''
98
+ email:
99
+ - cameronian0@protonmail.com
100
+ executables:
101
+ - dockerun
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".release_history.yml"
106
+ - ".rspec"
107
+ - Dockerfile.dockerun
108
+ - Gemfile
109
+ - Gemfile.lock
110
+ - README.md
111
+ - Rakefile
112
+ - bin/console
113
+ - bin/setup
114
+ - dockerun.gemspec
115
+ - exe/dockerun
116
+ - lib/dockerun.rb
117
+ - lib/dockerun/cli_prompt.rb
118
+ - lib/dockerun/command/dockerun.rb
119
+ - lib/dockerun/command/init.rb
120
+ - lib/dockerun/command/remove_container.rb
121
+ - lib/dockerun/command/reset_image.rb
122
+ - lib/dockerun/command/run.rb
123
+ - lib/dockerun/command/run_new_container.rb
124
+ - lib/dockerun/command/run_new_image.rb
125
+ - lib/dockerun/config.rb
126
+ - lib/dockerun/docker_command_factory_helper.rb
127
+ - lib/dockerun/docker_container_helper.rb
128
+ - lib/dockerun/docker_image_helper.rb
129
+ - lib/dockerun/template/general_template_writer.rb
130
+ - lib/dockerun/template/jruby_template_writer.rb
131
+ - lib/dockerun/template/template_engine.rb
132
+ - lib/dockerun/template/template_writer.rb
133
+ - lib/dockerun/template/template_writter.rb
134
+ - lib/dockerun/template_engine.rb
135
+ - lib/dockerun/user_info.rb
136
+ - lib/dockerun/version.rb
137
+ - template/Dockerfile_general.erb
138
+ - template/Dockerfile_jruby-9.4.0-jdk11.erb
139
+ homepage: ''
140
+ licenses: []
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 2.4.0
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubygems_version: 3.2.22
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: ''
161
+ test_files: []