donce 0.0.1 → 0.0.3
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/donce.gemspec +1 -1
- data/lib/donce.rb +15 -8
- data/test/test_donce.rb +14 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad7d3419ce887d6b42f6f92f6dc9ad8414b0c3c89c1fb0ef4600972ac54f754e
|
4
|
+
data.tar.gz: a8d95d419418e037968ae4f659a5b538a8c67c44fee323974befefa7d5651b5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22738b8cdd2b2eef8188c1e69dfea55a7d3b7317f73623fd2230cd65695dd033994f58a62fca0e549a5e846245c61b1ec0d870760d79becda4e4a769f62ba9dc
|
7
|
+
data.tar.gz: 86ee931f8f8149192661d2541b19abbd58377dd8d6aa7fc5770fbe1fdc66819aeb8ff409224938b74acedf5a94b5d961c40439f4263d83cdf3eb1e84b9e24169
|
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.0.3'
|
30
30
|
s.license = 'MIT'
|
31
31
|
s.summary = 'Builds and starts temporary Docker containers'
|
32
32
|
s.description =
|
data/lib/donce.rb
CHANGED
@@ -48,9 +48,8 @@ require 'shellwords'
|
|
48
48
|
# background execution of the container (in daemon mode):
|
49
49
|
#
|
50
50
|
# def test_runs_daemon
|
51
|
-
# donce(dockerfile: "FROM ubuntu\nCMD sleep 9999") do |id
|
51
|
+
# donce(dockerfile: "FROM ubuntu\nCMD sleep 9999") do |id|
|
52
52
|
# refute_empty(id) # the ID of the container
|
53
|
-
# refute_empty(host) # the hostname of it
|
54
53
|
# end
|
55
54
|
# end
|
56
55
|
#
|
@@ -61,6 +60,12 @@ require 'shellwords'
|
|
61
60
|
# Copyright:: Copyright (c) 2025 Yegor Bugayenko
|
62
61
|
# License:: MIT
|
63
62
|
module Kernel
|
63
|
+
# The name of the localhost inside Docker container.
|
64
|
+
# @return [String] The hostname
|
65
|
+
def donce_host
|
66
|
+
OS.linux? ? '172.17.0.1' : 'host.docker.internal'
|
67
|
+
end
|
68
|
+
|
64
69
|
# Build Docker image (or use existing one), run Docker container, and then clean up.
|
65
70
|
#
|
66
71
|
# @param [String] dockerfile The content of the +Dockerfile+
|
@@ -72,6 +77,7 @@ module Kernel
|
|
72
77
|
# @param [Boolean] root Let user inside the container be "root"?
|
73
78
|
# @param [String|Array<String>] command The command for the script inside the container
|
74
79
|
# @param [Integer] timeout Maximum seconds to spend on each +docker+ call
|
80
|
+
# @return [String] The stdout of the container
|
75
81
|
def donce(dockerfile: nil, image: nil, home: nil, log: $stdout, args: '', env: {}, root: false, command: '',
|
76
82
|
timeout: 10)
|
77
83
|
raise 'Either use "dockerfile" or "home"' if dockerfile && home
|
@@ -85,15 +91,16 @@ module Kernel
|
|
85
91
|
else
|
86
92
|
i = "donce-#{SecureRandom.hex(8)}"
|
87
93
|
if dockerfile
|
88
|
-
Dir.mktmpdir do |
|
89
|
-
File.write(File.join(
|
90
|
-
qbash("#{docker} build #{Shellwords.escape(
|
94
|
+
Dir.mktmpdir do |tmp|
|
95
|
+
File.write(File.join(tmp, 'Dockerfile'), dockerfile)
|
96
|
+
qbash("#{docker} build #{Shellwords.escape(tmp)} -t #{i}", log:)
|
91
97
|
end
|
98
|
+
else
|
99
|
+
qbash("#{docker} build #{Shellwords.escape(home)} -t #{i}", log:)
|
92
100
|
end
|
93
101
|
i
|
94
102
|
end
|
95
103
|
container = "donce-#{SecureRandom.hex(8)}"
|
96
|
-
host = OS.linux? ? '172.17.0.1' : 'host.docker.internal'
|
97
104
|
begin
|
98
105
|
stdout = nil
|
99
106
|
code = 0
|
@@ -102,7 +109,7 @@ module Kernel
|
|
102
109
|
docker, 'run',
|
103
110
|
block_given? ? '-d' : '',
|
104
111
|
'--name', Shellwords.escape(container),
|
105
|
-
OS.linux? ? '' : "--add-host #{
|
112
|
+
OS.linux? ? '' : "--add-host #{donce_host}:host-gateway",
|
106
113
|
args,
|
107
114
|
env.map { |k, v| "-e #{Shellwords.escape("#{k}=#{v}")}" }.join(' '),
|
108
115
|
root ? '' : "--user=#{Shellwords.escape("#{Process.uid}:#{Process.gid}")}",
|
@@ -126,7 +133,7 @@ module Kernel
|
|
126
133
|
"(exit code is ##{code}, stdout has #{stdout.split("\n").count} lines)"
|
127
134
|
end
|
128
135
|
if block_given?
|
129
|
-
r = yield container
|
136
|
+
r = yield container
|
130
137
|
return r
|
131
138
|
end
|
132
139
|
ensure
|
data/test/test_donce.rb
CHANGED
@@ -34,12 +34,24 @@ class TestDonce < Minitest::Test
|
|
34
34
|
assert_equal("hello\n", stdout)
|
35
35
|
end
|
36
36
|
|
37
|
+
def test_runs_existing_image
|
38
|
+
stdout = donce(image: 'ubuntu:24.04', command: 'echo hello', log: Loog::NULL)
|
39
|
+
assert_equal("hello\n", stdout)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_runs_from_home
|
43
|
+
Dir.mktmpdir do |home|
|
44
|
+
File.write(File.join(home, 'Dockerfile'), "FROM ubuntu\nCMD echo hello")
|
45
|
+
stdout = donce(home:, log: Loog::NULL)
|
46
|
+
assert_equal("hello\n", stdout)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
37
50
|
def test_runs_daemon
|
38
51
|
seen = false
|
39
|
-
donce(dockerfile: "FROM ubuntu\nCMD while true; do sleep 1; echo sleeping; done", log: Loog::NULL) do |id
|
52
|
+
donce(dockerfile: "FROM ubuntu\nCMD while true; do sleep 1; echo sleeping; done", log: Loog::NULL) do |id|
|
40
53
|
seen = true
|
41
54
|
refute_empty(id)
|
42
|
-
refute_empty(host)
|
43
55
|
end
|
44
56
|
assert(seen)
|
45
57
|
end
|