Skip to content

Commit 0e0606e

Browse files
committed
Add (non-revealing) logging to Docker secret initialization
1 parent 0daba3f commit 0e0606e

2 files changed

Lines changed: 36 additions & 10 deletions

File tree

lib/docker.rb

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1+
require 'berkeley_library/logging'
2+
13
module Docker
24
class Secret
35
class << self
6+
include BerkeleyLibrary::Logging
7+
48
def setup_environment!(fileglob = '/run/secrets/*')
5-
Dir[fileglob].each do |filepath|
6-
secret = File.read(filepath)
7-
secret_name = File.basename(filepath)
8-
ENV[secret_name] = secret unless secret.empty?
9+
Dir[fileglob].each(&method(:set_env_from))
10+
end
11+
12+
private
13+
14+
# rubocop:disable Naming/AccessorMethodName
15+
def set_env_from(filepath)
16+
secret = File.read(filepath)
17+
secret_name = File.basename(filepath)
18+
return logger.warn("Can't set ENV[#{secret_name}]; #{filepath} is empty") if secret.empty?
19+
20+
logger.info("Setting ENV[#{secret_name}] from #{filepath}").tap do
21+
ENV[secret_name] = secret
922
end
1023
end
24+
# rubocop:enable Naming/AccessorMethodName
1125
end
1226
end
1327

spec/lib/docker_spec.rb

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,23 @@ module Docker
2323
end
2424

2525
describe :setup_environment! do
26+
attr_reader :secret_names
27+
attr_reader :secret_paths
2628
attr_reader :expected_secrets
2729

2830
before do
2931
prefix = Time.now.to_i.to_s
3032
random = Random.new
33+
@secret_names = []
34+
@secret_paths = {}
3135
@expected_secrets = {}
3236
(0..8).each do |i|
33-
secret_name = "secret_#{prefix}_#{i}"
34-
secret = Base64.strict_encode64(random.bytes(128))
35-
expected_secrets[secret_name] = secret
36-
tmpdir_path.join(secret_name).binwrite(secret)
37+
secret_names << (secret_name = "secret_#{prefix}_#{i}")
38+
secret_paths[secret_name] = (secret_path = tmpdir_path.join(secret_name))
39+
Base64.strict_encode64(random.bytes(128)).tap do |secret|
40+
expected_secrets[secret_name] = secret
41+
secret_path.binwrite(secret)
42+
end
3743
end
3844
end
3945

@@ -42,12 +48,18 @@ module Docker
4248
end
4349

4450
it 'injects secrets into the environment' do
45-
fileglob = "#{tmpdir_path}/*"
46-
Docker::Secret.setup_environment!(fileglob)
51+
Docker::Secret.setup_environment!("#{tmpdir_path}/*")
4752
expected_secrets.each do |secret_name, secret_value|
4853
expect(ENV[secret_name]).to eq(secret_value)
4954
end
5055
end
56+
57+
it 'skips empty secrets' do
58+
n = secret_names.first
59+
secret_paths[n].binwrite('')
60+
Docker::Secret.setup_environment!("#{tmpdir_path}/*")
61+
expect(ENV[n]).to be_nil
62+
end
5163
end
5264
end
5365
end

0 commit comments

Comments
 (0)