donce 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/donce.gemspec +1 -1
- data/lib/donce.rb +17 -9
- data/test/test_donce.rb +32 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77e8fc303600f62224be74352774a1d7d2a0e151cf4935316112874bf2b4c39f
|
4
|
+
data.tar.gz: 220d2d7b9fcdcd4702fb594daf2211a0268f54a7fc21231bbf8e4a670f75d796
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e70dc715fb1b8166a6bf0805639b7f384e5f346438fdd8c030444d02a7fee8bcfb042ccd1bf71ef095ca201f1dbb4f586a30fe50a102686eb5b4dff6e6e2ee8
|
7
|
+
data.tar.gz: 2a4bf49df247f331a36dfaffb055a66f38e207dda78133c49d7db95e7178be4421253803d456e931cb40227802142c7f5d7363b11cb36345d85c662d79f00800
|
data/Gemfile
CHANGED
@@ -28,7 +28,7 @@ gem 'minitest', '5.25.4', require: false
|
|
28
28
|
gem 'minitest-reporters', '1.7.1', require: false
|
29
29
|
gem 'minitest-retry', '0.2.5', require: false
|
30
30
|
gem 'rake', '13.2.1', require: false
|
31
|
-
gem 'rspec-rails', '7.1.
|
31
|
+
gem 'rspec-rails', '7.1.1', require: false
|
32
32
|
gem 'rubocop', '1.71.2', require: false
|
33
33
|
gem 'rubocop-minitest', '0.36.0', require: false
|
34
34
|
gem 'rubocop-performance', '1.23.1', require: false
|
data/Gemfile.lock
CHANGED
@@ -134,7 +134,7 @@ GEM
|
|
134
134
|
reline (0.6.0)
|
135
135
|
io-console (~> 0.5)
|
136
136
|
rexml (3.4.0)
|
137
|
-
rspec-core (3.13.
|
137
|
+
rspec-core (3.13.3)
|
138
138
|
rspec-support (~> 3.13.0)
|
139
139
|
rspec-expectations (3.13.3)
|
140
140
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -142,7 +142,7 @@ GEM
|
|
142
142
|
rspec-mocks (3.13.2)
|
143
143
|
diff-lcs (>= 1.2.0, < 2.0)
|
144
144
|
rspec-support (~> 3.13.0)
|
145
|
-
rspec-rails (7.1.
|
145
|
+
rspec-rails (7.1.1)
|
146
146
|
actionpack (>= 7.0)
|
147
147
|
activesupport (>= 7.0)
|
148
148
|
railties (>= 7.0)
|
@@ -213,7 +213,7 @@ DEPENDENCIES
|
|
213
213
|
minitest-reporters (= 1.7.1)
|
214
214
|
minitest-retry (= 0.2.5)
|
215
215
|
rake (= 13.2.1)
|
216
|
-
rspec-rails (= 7.1.
|
216
|
+
rspec-rails (= 7.1.1)
|
217
217
|
rubocop (= 1.71.2)
|
218
218
|
rubocop-minitest (= 0.36.0)
|
219
219
|
rubocop-performance (= 1.23.1)
|
data/donce.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
27
27
|
s.required_ruby_version = '>=3.0'
|
28
28
|
s.name = 'donce'
|
29
|
-
s.version = '0.0
|
29
|
+
s.version = '0.1.0'
|
30
30
|
s.license = 'MIT'
|
31
31
|
s.summary = 'Builds and starts temporary Docker containers'
|
32
32
|
s.description =
|
data/lib/donce.rb
CHANGED
@@ -68,7 +68,7 @@ module Kernel
|
|
68
68
|
|
69
69
|
# Build Docker image (or use existing one), run Docker container, and then clean up.
|
70
70
|
#
|
71
|
-
# @param [String] dockerfile The content of the +Dockerfile+
|
71
|
+
# @param [String] dockerfile The content of the +Dockerfile+ (if array is provided, it will be concatenated)
|
72
72
|
# @param [String] home The directory with Dockerfile and all other necessary files
|
73
73
|
# @param [String] image The name of Docker image, e.g. "ubuntu:24.04"
|
74
74
|
# @param [Logger] log The logging destination, can be +$stdout+
|
@@ -76,12 +76,13 @@ module Kernel
|
|
76
76
|
# @param [Hash<String,String>] env Environment variables going into the container
|
77
77
|
# @param [Hash<String,String>] volumes Local to container volumes mapping
|
78
78
|
# @param [Hash<String,String>] ports Local to container port mapping
|
79
|
+
# @param [Hash<String,String>] build_args Arguments for +docker build+ as +--build-arg+ may need
|
79
80
|
# @param [Boolean] root Let user inside the container be "root"?
|
80
81
|
# @param [String|Array<String>] command The command for the script inside the container
|
81
82
|
# @param [Integer] timeout Maximum seconds to spend on each +docker+ call
|
82
83
|
# @return [String] The stdout of the container
|
83
84
|
def donce(dockerfile: nil, image: nil, home: nil, log: $stdout, args: '', env: {}, root: false, command: '',
|
84
|
-
timeout: 10, volumes: {}, ports: {})
|
85
|
+
timeout: 10, volumes: {}, ports: {}, build_args: {})
|
85
86
|
raise 'Either use "dockerfile" or "home"' if dockerfile && home
|
86
87
|
raise 'Either use "dockerfile" or "image"' if dockerfile && image
|
87
88
|
raise 'Either use "image" or "home"' if home && image
|
@@ -92,13 +93,20 @@ module Kernel
|
|
92
93
|
image
|
93
94
|
else
|
94
95
|
i = "donce-#{SecureRandom.hex(6)}"
|
96
|
+
a = [
|
97
|
+
"--tag #{i}",
|
98
|
+
build_args.map { |k, v| "--build-arg #{Shellwords.escape("#{k}=#{v}")}" }.join(' ')
|
99
|
+
].join(' ')
|
95
100
|
if dockerfile
|
96
101
|
Dir.mktmpdir do |tmp|
|
102
|
+
dockerfile = dockerfile.join("\n") if dockerfile.is_a?(Array)
|
97
103
|
File.write(File.join(tmp, 'Dockerfile'), dockerfile)
|
98
|
-
qbash("#{docker} build #{Shellwords.escape(tmp)}
|
104
|
+
qbash("#{docker} build #{a} #{Shellwords.escape(tmp)}", log:)
|
99
105
|
end
|
106
|
+
elsif home
|
107
|
+
qbash("#{docker} build #{a} #{Shellwords.escape(home)}", log:)
|
100
108
|
else
|
101
|
-
|
109
|
+
raise 'Either "dockerfile" or "home" must be provided'
|
102
110
|
end
|
103
111
|
i
|
104
112
|
end
|
@@ -109,13 +117,13 @@ module Kernel
|
|
109
117
|
begin
|
110
118
|
cmd = [
|
111
119
|
docker, 'run',
|
112
|
-
block_given? ? '
|
120
|
+
block_given? ? '--detach' : nil,
|
113
121
|
'--name', Shellwords.escape(container),
|
114
122
|
OS.linux? ? nil : "--add-host #{donce_host}:host-gateway",
|
115
123
|
args,
|
116
|
-
env.map { |k, v| "
|
117
|
-
ports.map { |k, v| "
|
118
|
-
volumes.map { |k, v| "
|
124
|
+
env.map { |k, v| "--env #{Shellwords.escape("#{k}=#{v}")}" }.join(' '),
|
125
|
+
ports.map { |k, v| "--publish #{Shellwords.escape("#{k}:#{v}")}" }.join(' '),
|
126
|
+
volumes.map { |k, v| "--volume #{Shellwords.escape("#{k}:#{v}")}" }.join(' '),
|
119
127
|
root ? nil : "--user=#{Shellwords.escape("#{Process.uid}:#{Process.gid}")}",
|
120
128
|
Shellwords.escape(img),
|
121
129
|
command
|
@@ -144,7 +152,7 @@ module Kernel
|
|
144
152
|
log:
|
145
153
|
)
|
146
154
|
stdout = logs if block_given?
|
147
|
-
qbash("#{docker} rm
|
155
|
+
qbash("#{docker} rm --force #{Shellwords.escape(container)}", log:)
|
148
156
|
end
|
149
157
|
stdout
|
150
158
|
ensure
|
data/test/test_donce.rb
CHANGED
@@ -34,6 +34,20 @@ class TestDonce < Minitest::Test
|
|
34
34
|
assert_equal("hello\n", stdout)
|
35
35
|
end
|
36
36
|
|
37
|
+
def test_prints_build_args
|
38
|
+
stdout = donce(
|
39
|
+
dockerfile: [
|
40
|
+
'FROM ubuntu',
|
41
|
+
'ARG FOO=what?',
|
42
|
+
'RUN echo $FOO > /tmp/foo',
|
43
|
+
'CMD cat /tmp/foo'
|
44
|
+
],
|
45
|
+
build_args: { 'FOO' => 'hello' },
|
46
|
+
log: Loog::NULL
|
47
|
+
)
|
48
|
+
assert_equal("hello\n", stdout)
|
49
|
+
end
|
50
|
+
|
37
51
|
def test_runs_existing_image
|
38
52
|
stdout = donce(image: 'ubuntu:24.04', command: 'echo hello', log: Loog::NULL)
|
39
53
|
assert_equal("hello\n", stdout)
|
@@ -47,6 +61,24 @@ class TestDonce < Minitest::Test
|
|
47
61
|
end
|
48
62
|
end
|
49
63
|
|
64
|
+
def test_copies_resources
|
65
|
+
content = 'hello!'
|
66
|
+
Dir.mktmpdir do |home|
|
67
|
+
File.write(File.join(home, 'test.txt'), content)
|
68
|
+
File.write(
|
69
|
+
File.join(home, 'Dockerfile'),
|
70
|
+
[
|
71
|
+
'FROM ubuntu',
|
72
|
+
'WORKDIR /foo',
|
73
|
+
'COPY test.txt .',
|
74
|
+
'CMD cat test.txt'
|
75
|
+
].join("\n")
|
76
|
+
)
|
77
|
+
stdout = donce(home:, log: Loog::NULL)
|
78
|
+
assert_equal(content, stdout)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
50
82
|
def test_runs_daemon
|
51
83
|
seen = false
|
52
84
|
donce(dockerfile: "FROM ubuntu\nCMD while true; do sleep 1; echo sleeping; done", log: Loog::NULL) do |id|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: donce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-02-
|
11
|
+
date: 2025-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|