Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion lib/berkeley_library/docker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module BerkeleyLibrary
module Docker
class << self
def running_in_container?
File.exist?('/.dockerenv') || init_cgroup_is_dockerish?
File.exist?('/.dockerenv') || init_cgroup_is_dockerish? || env_is_k8sish?
end

private
Expand All @@ -19,6 +19,10 @@ def init_cgroup_is_dockerish?
false
end
end

def env_is_k8sish?
ENV.key?('KUBERNETES_SERVICE_HOST')
end
end
end
end
24 changes: 19 additions & 5 deletions spec/berkeley_library/docker_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,30 @@ module BerkeleyLibrary
1:name=systemd:/
EOL

CGROUPS = {
trad: TRADITIONAL_CGROUP,
docker: DOCKERISH_CGROUP
}

it 'is true when /.dockerenv exists' do
mock_dockerenv
expect(BerkeleyLibrary::Docker.running_in_container?).to be true
end

it 'is true when KUBERNETES_SERVICE_HOST is set' do
mock_k8s_svc_host
expect(BerkeleyLibrary::Docker.running_in_container?).to be true
end

it 'is true when /proc/1/cgroup is docker-like' do
mock_dockerenv(false)
mock_init_cgroup
mock_init_cgroup(:docker)
expect(BerkeleyLibrary::Docker.running_in_container?).to be true
end

it 'is false when /proc/1/cgroup is traditional' do
mock_dockerenv(false)
mock_init_cgroup(false)
mock_init_cgroup(:trad)
expect(BerkeleyLibrary::Docker.running_in_container?).to be false
end

Expand All @@ -60,17 +70,21 @@ module BerkeleyLibrary

private

def mock_k8s_svc_host(set = true)
expect(ENV).to receive(:key?).with('KUBERNETES_SERVICE_HOST').and_return(set)
end

def mock_dockerenv(exists = true)
expect(File)
.to receive(:exist?).with('/.dockerenv')
.and_return(exists)
end

def mock_init_cgroup(dockerish = true)
def mock_init_cgroup(type)
cgroup_data = CGROUPS.fetch(type)
expect(File)
.to receive(:open).with('/proc/1/cgroup')
.and_return(
StringIO.new(dockerish ? DOCKERISH_CGROUP : TRADITIONAL_CGROUP))
.and_return(StringIO.new(cgroup_data))
end
end
end
Expand Down