Class: Docker::Compose::Session
- Inherits:
-
Object
- Object
- Docker::Compose::Session
- 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
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
-
#file ⇒ Object
readonly
Returns the value of attribute file.
Instance Method Summary collapse
-
#config(*args) ⇒ Hash
Validate docker-compose file and return it as Hash.
-
#initialize(shell = Backticks::Runner.new(interactive: true), dir: Dir.pwd, file: 'docker-compose.yml') ⇒ Session
constructor
A new instance of Session.
-
#logs(*services) ⇒ true
Monitor the logs of one or more containers.
-
#port(service, port, protocol: 'tcp', index: 1) ⇒ Object
Figure out which host a port a given service port has been published to.
- #ps ⇒ Object
- #rm(*services, force: false, volumes: false, all: true) ⇒ Object
-
#run(service, *cmd, detached: false, no_deps: false, env_vars: [], rm: false) ⇒ Object
Idempotently run an arbitrary command with a service container.
-
#run!(*args) ⇒ String
Run a docker-compose command without validating that the CLI parameters make sense.
-
#stop(*services, timeout: 10) ⇒ Object
Stop running services.
-
#up(*services, detached: false, timeout: 10, no_build: false, no_deps: false) ⇒ true
Idempotently up the given services in the project.
-
#version(short: false) ⇒ String, Hash
Determine the installed version of docker-compose.
Constructor Details
#initialize(shell = Backticks::Runner.new(interactive: true), dir: Dir.pwd, file: 'docker-compose.yml') ⇒ Session
Returns a new instance of Session.
20 21 22 23 24 25 |
# File 'lib/docker/compose/session.rb', line 20 def initialize(shell = Backticks::Runner.new(interactive: true), dir:Dir.pwd, file:'docker-compose.yml') @shell = shell @dir = dir @file = file end |
Instance Attribute Details
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
18 19 20 |
# File 'lib/docker/compose/session.rb', line 18 def dir @dir end |
#file ⇒ Object (readonly)
Returns the value of attribute file.
18 19 20 |
# File 'lib/docker/compose/session.rb', line 18 def file @file end |
Instance Method Details
#config(*args) ⇒ Hash
Validate docker-compose file and return it as Hash
30 31 32 33 |
# File 'lib/docker/compose/session.rb', line 30 def config(*args) config = run!('config', *args) YAML.load(config) end |
#logs(*services) ⇒ true
Monitor the logs of one or more containers.
39 40 41 42 |
# File 'lib/docker/compose/session.rb', line 39 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.
114 115 116 |
# File 'lib/docker/compose/session.rb', line 114 def port(service, port, protocol:'tcp', index:1) run!('port', { protocol: protocol, index: index }, service, port) end |
#ps ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/docker/compose/session.rb', line 44 def ps() inter = @shell.interactive @shell.interactive = false lines = run!('ps', q:true).split(/[\r\n]+/) containers = Collection.new lines.each do |id| containers << docker_ps(id) end containers ensure @shell.interactive = inter end |
#rm(*services, force: false, volumes: false, all: true) ⇒ Object
80 81 82 |
# File 'lib/docker/compose/session.rb', line 80 def rm(*services, force:false, volumes:false, all:true) run!('rm', { f: force, v: volumes, a: all }, services) end |
#run(service, *cmd, detached: false, no_deps: false, env_vars: [], rm: false) ⇒ Object
Idempotently run an arbitrary command with a service container.
94 95 96 97 98 |
# File 'lib/docker/compose/session.rb', line 94 def run(service, *cmd, detached:false, no_deps:false, env_vars:[], rm:false) formated_vars = env_vars.map { |v| { e: v } } run!('run', { d: detached, no_deps: no_deps, rm: rm }, *formated_vars, service, cmd) end |
#run!(*args) ⇒ String
Run a docker-compose command without validating that the CLI parameters make sense. Prepend project and file options if suitable.
147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/docker/compose/session.rb', line 147 def run!(*args) project_opts = { file: @file } Dir.chdir(@dir) do cmd = @shell.run('docker-compose', project_opts, *args).join status = cmd.status out = cmd.captured_output err = cmd.captured_error status.success? || fail(Error.new(args.first, status, err)) out end end |
#stop(*services, timeout: 10) ⇒ Object
Stop running services.
104 105 106 |
# File 'lib/docker/compose/session.rb', line 104 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 up the given services in the project.
72 73 74 75 76 77 78 |
# File 'lib/docker/compose/session.rb', line 72 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.
123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/docker/compose/session.rb', line 123 def version(short:false) result = run!('version', short: short, file: false, dir: false) if short result.strip else lines = result.split(/[\r\n]+/) lines.inject({}) do |h, line| kv = line.split(/: +/, 2) h[kv.first] = kv.last h end end end |