Class: Docker::Compose::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/docker/compose/session.rb

Overview

A Ruby OOP interface to a docker-compose session. A session is bound to a particular directory and docker-compose file (which are set at initialize time) and invokes whichever docker-compose command is resident in $PATH.

Run docker-compose commands by calling instance methods of this class and passing kwargs that are equivalent to the CLI options you would pass to the command-line tool.

Note that the Ruby command methods usually expose a subset of the options allowed by the docker-compose CLI, and that options are sometimes renamed for clarity, e.g. the “-d” flag always becomes the “detached:” kwarg.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(shell = Backticks::Runner.new, dir: Dir.pwd, file: 'docker-compose.yml') ⇒ Session



18
19
20
21
22
23
# File 'lib/docker/compose/session.rb', line 18

def initialize(shell=Backticks::Runner.new,
               dir:Dir.pwd, file:'docker-compose.yml')
  @shell = shell
  @dir = dir
  @file = file
end

Instance Attribute Details

#dirObject (readonly)

Returns the value of attribute dir.



16
17
18
# File 'lib/docker/compose/session.rb', line 16

def dir
  @dir
end

#fileObject (readonly)

Returns the value of attribute file.



16
17
18
# File 'lib/docker/compose/session.rb', line 16

def file
  @file
end

Instance Method Details

#logs(*services) ⇒ true

Monitor the logs of one or more containers.

Raises:

  • (RuntimeError)

    if command fails



29
30
31
32
# File 'lib/docker/compose/session.rb', line 29

def logs(*services)
  run!('logs', services)
  true
end

#port(service, port, protocol: 'tcp', index: 1) ⇒ Object

Figure out which host a port a given service port has been published to.



65
66
67
# File 'lib/docker/compose/session.rb', line 65

def port(service, port, protocol:'tcp', index:1)
  run!('port', {protocol:protocol, index:index}, service, port)
end

#run!(*args) ⇒ String

Run a docker-compose command without validating that the CLI parameters make sense. Prepend project and file options if suitable.

Raises:

  • (RuntimeError)

    if command fails

See Also:

  • Docker::Compose::Shell#command


98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/docker/compose/session.rb', line 98

def run!(*args)
  project_opts = {
    file: @file
  }

  Dir.chdir(@dir) do
    cmd = @shell.command('docker-compose', project_opts, *args).join
    status, out, err= cmd.status, cmd.captured_output, cmd.captured_error
    status.success? || raise(Error.new(args.first, status, err))
    out
  end
end

#stop(*services, timeout: 10) ⇒ Object

Stop running services.



56
57
58
# File 'lib/docker/compose/session.rb', line 56

def stop(*services, timeout:10)
  run!('stop', {timeout:timeout}, services)
end

#up(*services, detached: false, timeout: 10, no_build: false, no_deps: false) ⇒ true

Idempotently run services in the project,

Raises:

  • (RuntimeError)

    if command fails



45
46
47
48
49
50
51
# File 'lib/docker/compose/session.rb', line 45

def up(*services,
       detached:false, timeout:10, no_build:false, no_deps:false)
  run!('up',
       {d:detached, timeout:timeout, no_build:no_build, no_deps:no_deps},
       services)
  true
end

#version(short: false) ⇒ String, Hash

Determine the installed version of docker-compose.

Raises:

  • (RuntimeError)

    if command fails



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/docker/compose/session.rb', line 74

def version(short:false)
  result = run!('version', short:short, file:false, dir:false)

  if short
    result.strip
  else
    lines = result.split("\n")
    lines.inject({}) do |h, line|
      kv = line.split(/: +/, 2)
      h[kv.first] = kv.last
      h
    end
  end
end