Sha256: 7baf2e08908b4d0fda6c5abc08509824362ba748a47d067033a42534fc147c9f

Contents?: true

Size: 1.13 KB

Versions: 15

Compression:

Stored size: 1.13 KB

Contents

# Encode an env hash as a string where secret values have been looked up and all values escaped for Docker.
class Kamal::EnvFile
  def initialize(env)
    @env = env
  end

  def to_s
    env_file = StringIO.new.tap do |contents|
      @env.each do |key, value|
        contents << docker_env_file_line(key, value)
      end
    end.string

    # Ensure the file has some contents to avoid the SSHKIT empty file warning
    env_file.presence || "\n"
  end

  alias to_str to_s

  private
    def docker_env_file_line(key, value)
      "#{key}=#{escape_docker_env_file_value(value)}\n"
    end

    # Escape a value to make it safe to dump in a docker file.
    def escape_docker_env_file_value(value)
      # keep non-ascii(UTF-8) characters as it is
      value.to_s.scan(/[\x00-\x7F]+|[^\x00-\x7F]+/).map do |part|
        part.ascii_only? ? escape_docker_env_file_ascii_value(part) : part
      end.join
    end

    def escape_docker_env_file_ascii_value(value)
      # Doublequotes are treated literally in docker env files
      # so remove leading and trailing ones and unescape any others
      value.to_s.dump[1..-2].gsub(/\\"/, "\"")
    end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
kamal-1.9.2 lib/kamal/env_file.rb
kamal-1.9.1 lib/kamal/env_file.rb
kamal-1.9.0 lib/kamal/env_file.rb
kamal-2.0.0.alpha lib/kamal/env_file.rb
kamal-1.8.3 lib/kamal/env_file.rb
kamal-1.8.2 lib/kamal/env_file.rb
kamal-1.8.1 lib/kamal/env_file.rb
kamal-1.8.0 lib/kamal/env_file.rb
kamal-1.7.3 lib/kamal/env_file.rb
kamal-1.7.2 lib/kamal/env_file.rb
kamal-1.7.1 lib/kamal/env_file.rb
kamal-1.7.0 lib/kamal/env_file.rb
kamal-1.6.0 lib/kamal/env_file.rb
kamal-1.5.1 lib/kamal/env_file.rb
kamal-1.5.0 lib/kamal/env_file.rb