diff --git a/lib/berkeley_library/docker.rb b/lib/berkeley_library/docker.rb index c673670..b1df584 100644 --- a/lib/berkeley_library/docker.rb +++ b/lib/berkeley_library/docker.rb @@ -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 @@ -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 diff --git a/spec/berkeley_library/docker_spec.rb b/spec/berkeley_library/docker_spec.rb index 5e3f68f..27e11de 100644 --- a/spec/berkeley_library/docker_spec.rb +++ b/spec/berkeley_library/docker_spec.rb @@ -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 @@ -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