module DockerComposeEnv

The main module for DockerComposeEnv, this provides a single “easy mode” method for setting up the environment.

Constants

VERSION

Public Class Methods

setup!(env: ENV, file: 'docker-compose.yml', process_env: {}) click to toggle source
# File lib/docker_compose_env.rb, line 8
def self.setup!(env: ENV, file: 'docker-compose.yml', process_env: {})
  config = YAML.safe_load(File.read(file))

  config.fetch('services', {}).keys.each do |service_name|
    (config['services'][service_name]['ports'] || []).each do |container_port|
      compose_port_info = nil

      if /(\d+)\/udp$/ =~ container_port
        parsed_port = /(?<port>\d+)\/udp$/.match(container_port).named_captures['port']

        command = "docker-compose --file=#{file} port --protocol=udp #{service_name} #{parsed_port}"
        Open3.popen3(process_env, command) do |stdin, stdout, stderr, wait_thr|
          compose_port_info = stdout.read
          wait_thr.value
        end

        if (compose_port_info =~ /^0\.0\.0\.0\:\d+\s*$/) == 0
          if env["#{service_name.upcase}_HOST"].nil?
            env["#{service_name.upcase}_HOST"] = '0.0.0.0'
          end

          if env["#{service_name.upcase}_PORT_#{parsed_port}_UDP"].nil?
            env["#{service_name.upcase}_PORT_#{parsed_port}_UDP"] = compose_port_info.gsub(/0\.0\.0\.0:(\d+)\s*/, '\1')
          end
        end
      else
        command = "docker-compose --file=#{file} port #{service_name} #{container_port}"
        Open3.popen3(process_env, command) do |stdin, stdout, stderr, wait_thr|
          compose_port_info = stdout.read
          wait_thr.value
        end

        if (compose_port_info =~ /^0\.0\.0\.0\:\d+\s*$/) == 0
          if env["#{service_name.upcase}_HOST"].nil?
            env["#{service_name.upcase}_HOST"] = '0.0.0.0'
          end

          if env["#{service_name.upcase}_PORT_#{container_port}"].nil?
            env["#{service_name.upcase}_PORT_#{container_port}"] = compose_port_info.gsub(/0\.0\.0\.0:(\d+)\s*/, '\1')
          end
        end
      end
    end
  end
rescue Errno::ENOENT => exception
  raise exception unless exception.message == 'No such file or directory - docker-compose'
end