lex-docker 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +16 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +53 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +13 -0
- data/lex-docker.gemspec +31 -0
- data/lib/legion/extensions/docker/client.rb +33 -0
- data/lib/legion/extensions/docker/helpers/client.rb +32 -0
- data/lib/legion/extensions/docker/runners/containers.rb +72 -0
- data/lib/legion/extensions/docker/runners/images.rb +47 -0
- data/lib/legion/extensions/docker/runners/networks.rb +27 -0
- data/lib/legion/extensions/docker/version.rb +9 -0
- data/lib/legion/extensions/docker.rb +16 -0
- metadata +86 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: cfc6c9e230ea3f7eae802316ed21b5188f252ad70efa3033790c57097764c7e0
|
|
4
|
+
data.tar.gz: 0707ac874e590ee10f6134e76cef740a5a73f100c0e419d67df5031cfb434534
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: c7d3a9eb99f9a06720c51f7a72ce3ae8ac15fec6ddda5c988660d57b5ce7ec88ca55d9e17afc6e52a5669642256db309651889465e27c0e9b12e2831397265f7
|
|
7
|
+
data.tar.gz: 4585d38424b5083709fbcdb6faa70abde580318f46fbc02f649e61367e60c25e9a51b62c9cd0da15f566910395fabd0766e008729c518b0c4774275a4fd8cc0c
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches: [main]
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
ci:
|
|
9
|
+
uses: LegionIO/.github/.github/workflows/ci.yml@main
|
|
10
|
+
|
|
11
|
+
release:
|
|
12
|
+
needs: ci
|
|
13
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
14
|
+
uses: LegionIO/.github/.github/workflows/release.yml@main
|
|
15
|
+
secrets:
|
|
16
|
+
rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
TargetRubyVersion: 3.4
|
|
3
|
+
NewCops: enable
|
|
4
|
+
SuggestExtensions: false
|
|
5
|
+
|
|
6
|
+
Layout/LineLength:
|
|
7
|
+
Max: 160
|
|
8
|
+
|
|
9
|
+
Layout/SpaceAroundEqualsInParameterDefault:
|
|
10
|
+
EnforcedStyle: space
|
|
11
|
+
|
|
12
|
+
Layout/HashAlignment:
|
|
13
|
+
EnforcedHashRocketStyle: table
|
|
14
|
+
EnforcedColonStyle: table
|
|
15
|
+
|
|
16
|
+
Metrics/MethodLength:
|
|
17
|
+
Max: 50
|
|
18
|
+
|
|
19
|
+
Metrics/ClassLength:
|
|
20
|
+
Max: 1500
|
|
21
|
+
|
|
22
|
+
Metrics/ModuleLength:
|
|
23
|
+
Max: 1500
|
|
24
|
+
|
|
25
|
+
Metrics/BlockLength:
|
|
26
|
+
Max: 40
|
|
27
|
+
Exclude:
|
|
28
|
+
- 'spec/**/*'
|
|
29
|
+
|
|
30
|
+
Metrics/ParameterLists:
|
|
31
|
+
Max: 10
|
|
32
|
+
|
|
33
|
+
Metrics/AbcSize:
|
|
34
|
+
Max: 60
|
|
35
|
+
|
|
36
|
+
Metrics/CyclomaticComplexity:
|
|
37
|
+
Max: 15
|
|
38
|
+
|
|
39
|
+
Metrics/PerceivedComplexity:
|
|
40
|
+
Max: 17
|
|
41
|
+
|
|
42
|
+
Style/Documentation:
|
|
43
|
+
Enabled: false
|
|
44
|
+
|
|
45
|
+
Style/SymbolArray:
|
|
46
|
+
Enabled: true
|
|
47
|
+
|
|
48
|
+
Style/FrozenStringLiteralComment:
|
|
49
|
+
Enabled: true
|
|
50
|
+
EnforcedStyle: always
|
|
51
|
+
|
|
52
|
+
Naming/FileName:
|
|
53
|
+
Enabled: false
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.0] - 2026-03-22
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Initial release
|
|
7
|
+
- `Helpers::Client` — Docker API connection wrapper with configurable URL and timeouts
|
|
8
|
+
- `Runners::Containers` — list_containers, create_container, start_container, stop_container, remove_container, container_logs
|
|
9
|
+
- `Runners::Images` — list_images, pull_image, build_image, remove_image
|
|
10
|
+
- `Runners::Networks` — list_networks, create_network
|
|
11
|
+
- Standalone `Client` class for use outside the Legion framework
|
data/Gemfile
ADDED
data/lex-docker.gemspec
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/legion/extensions/docker/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'lex-docker'
|
|
7
|
+
spec.version = Legion::Extensions::Docker::VERSION
|
|
8
|
+
spec.authors = ['Esity']
|
|
9
|
+
spec.email = ['matthewdiverson@gmail.com']
|
|
10
|
+
|
|
11
|
+
spec.summary = 'LEX::Docker'
|
|
12
|
+
spec.description = 'Used to connect Legion to Docker'
|
|
13
|
+
spec.homepage = 'https://github.com/LegionIO/lex-docker'
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
spec.required_ruby_version = '>= 3.4'
|
|
16
|
+
|
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-docker'
|
|
19
|
+
spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-docker/blob/main/CHANGELOG.md'
|
|
20
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
21
|
+
|
|
22
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
24
|
+
end
|
|
25
|
+
spec.bindir = 'exe'
|
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
27
|
+
spec.require_paths = ['lib']
|
|
28
|
+
|
|
29
|
+
spec.add_dependency 'base64'
|
|
30
|
+
spec.add_dependency 'docker-api', '~> 2.0'
|
|
31
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'helpers/client'
|
|
4
|
+
require_relative 'runners/containers'
|
|
5
|
+
require_relative 'runners/images'
|
|
6
|
+
require_relative 'runners/networks'
|
|
7
|
+
|
|
8
|
+
module Legion
|
|
9
|
+
module Extensions
|
|
10
|
+
module Docker
|
|
11
|
+
class Client
|
|
12
|
+
include Helpers::Client
|
|
13
|
+
include Runners::Containers
|
|
14
|
+
include Runners::Images
|
|
15
|
+
include Runners::Networks
|
|
16
|
+
|
|
17
|
+
attr_reader :opts
|
|
18
|
+
|
|
19
|
+
def initialize(**opts)
|
|
20
|
+
@opts = opts
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def settings
|
|
24
|
+
{ options: @opts }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def connection(**override)
|
|
28
|
+
super(**@opts, **override)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'docker-api'
|
|
4
|
+
|
|
5
|
+
module Legion
|
|
6
|
+
module Extensions
|
|
7
|
+
module Docker
|
|
8
|
+
module Helpers
|
|
9
|
+
module Client
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
def connection(**opts)
|
|
13
|
+
url = opts[:docker_url] || settings_value(:docker_url, 'unix:///var/run/docker.sock')
|
|
14
|
+
::Docker.url = url
|
|
15
|
+
::Docker.options = {
|
|
16
|
+
read_timeout: opts.fetch(:read_timeout, 120),
|
|
17
|
+
write_timeout: opts.fetch(:write_timeout, 120)
|
|
18
|
+
}
|
|
19
|
+
::Docker
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def settings_value(key, default)
|
|
23
|
+
return default unless defined?(Legion::Settings)
|
|
24
|
+
|
|
25
|
+
settings = Legion::Settings[:'lex-docker']
|
|
26
|
+
settings.is_a?(Hash) ? settings.fetch(key, default) : default
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Docker
|
|
6
|
+
module Runners
|
|
7
|
+
module Containers
|
|
8
|
+
def list_containers(**opts)
|
|
9
|
+
conn = opts.delete(:connection)
|
|
10
|
+
connection(**opts) unless conn
|
|
11
|
+
::Docker::Container.all(all: opts.fetch(:all, false))&.map(&:info)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def create_container(**opts)
|
|
15
|
+
conn = opts.delete(:connection)
|
|
16
|
+
connection(**opts) unless conn
|
|
17
|
+
image = opts.fetch(:image)
|
|
18
|
+
name = opts[:name]
|
|
19
|
+
cmd = opts[:cmd]
|
|
20
|
+
env = opts[:env]
|
|
21
|
+
config = { 'Image' => image }
|
|
22
|
+
config['name'] = name if name
|
|
23
|
+
config['Cmd'] = cmd if cmd
|
|
24
|
+
config['Env'] = env if env
|
|
25
|
+
container = ::Docker::Container.create(config)
|
|
26
|
+
{ container: container.info }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def start_container(**opts)
|
|
30
|
+
conn = opts.delete(:connection)
|
|
31
|
+
connection(**opts) unless conn
|
|
32
|
+
container_id = opts.fetch(:container_id)
|
|
33
|
+
container = ::Docker::Container.get(container_id)
|
|
34
|
+
container.start
|
|
35
|
+
{ started: true, container_id: container_id }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def stop_container(**opts)
|
|
39
|
+
conn = opts.delete(:connection)
|
|
40
|
+
connection(**opts) unless conn
|
|
41
|
+
container_id = opts.fetch(:container_id)
|
|
42
|
+
timeout = opts.fetch(:timeout, 10)
|
|
43
|
+
container = ::Docker::Container.get(container_id)
|
|
44
|
+
container.stop(t: timeout)
|
|
45
|
+
{ stopped: true, container_id: container_id }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def remove_container(**opts)
|
|
49
|
+
conn = opts.delete(:connection)
|
|
50
|
+
connection(**opts) unless conn
|
|
51
|
+
container_id = opts.fetch(:container_id)
|
|
52
|
+
force = opts.fetch(:force, false)
|
|
53
|
+
container = ::Docker::Container.get(container_id)
|
|
54
|
+
container.remove(force: force)
|
|
55
|
+
{ removed: true, container_id: container_id }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def container_logs(**opts)
|
|
59
|
+
conn = opts.delete(:connection)
|
|
60
|
+
connection(**opts) unless conn
|
|
61
|
+
container_id = opts.fetch(:container_id)
|
|
62
|
+
tail = opts.fetch(:tail, 'all')
|
|
63
|
+
timestamps = opts.fetch(:timestamps, false)
|
|
64
|
+
container = ::Docker::Container.get(container_id)
|
|
65
|
+
logs = container.logs(stdout: true, stderr: true, tail: tail, timestamps: timestamps)
|
|
66
|
+
{ logs: logs, container_id: container_id }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Docker
|
|
6
|
+
module Runners
|
|
7
|
+
module Images
|
|
8
|
+
def list_images(**opts)
|
|
9
|
+
conn = opts.delete(:connection)
|
|
10
|
+
connection(**opts) unless conn
|
|
11
|
+
::Docker::Image.all&.map(&:info)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def pull_image(**opts)
|
|
15
|
+
conn = opts.delete(:connection)
|
|
16
|
+
connection(**opts) unless conn
|
|
17
|
+
repo = opts.fetch(:repo)
|
|
18
|
+
tag = opts.fetch(:tag, 'latest')
|
|
19
|
+
image = ::Docker::Image.create('fromImage' => repo, 'tag' => tag)
|
|
20
|
+
{ image: image.info }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def build_image(**opts)
|
|
24
|
+
conn = opts.delete(:connection)
|
|
25
|
+
connection(**opts) unless conn
|
|
26
|
+
dir = opts.fetch(:dir)
|
|
27
|
+
t = opts[:tag]
|
|
28
|
+
build_opts = {}
|
|
29
|
+
build_opts['t'] = t if t
|
|
30
|
+
image = ::Docker::Image.build_from_dir(dir, build_opts)
|
|
31
|
+
{ image: image.info }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def remove_image(**opts)
|
|
35
|
+
conn = opts.delete(:connection)
|
|
36
|
+
connection(**opts) unless conn
|
|
37
|
+
image_id = opts.fetch(:image_id)
|
|
38
|
+
force = opts.fetch(:force, false)
|
|
39
|
+
image = ::Docker::Image.get(image_id)
|
|
40
|
+
image.remove(force: force)
|
|
41
|
+
{ removed: true, image_id: image_id }
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Legion
|
|
4
|
+
module Extensions
|
|
5
|
+
module Docker
|
|
6
|
+
module Runners
|
|
7
|
+
module Networks
|
|
8
|
+
def list_networks(**opts)
|
|
9
|
+
conn = opts.delete(:connection)
|
|
10
|
+
connection(**opts) unless conn
|
|
11
|
+
::Docker::Network.all&.map(&:info)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def create_network(**opts)
|
|
15
|
+
conn = opts.delete(:connection)
|
|
16
|
+
connection(**opts) unless conn
|
|
17
|
+
name = opts.fetch(:name)
|
|
18
|
+
driver = opts.fetch(:driver, 'bridge')
|
|
19
|
+
config = { 'Name' => name, 'Driver' => driver }
|
|
20
|
+
network = ::Docker::Network.create(name, config)
|
|
21
|
+
{ network: network.info }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'legion/extensions/docker/version'
|
|
4
|
+
require 'legion/extensions/docker/helpers/client'
|
|
5
|
+
require 'legion/extensions/docker/runners/containers'
|
|
6
|
+
require 'legion/extensions/docker/runners/images'
|
|
7
|
+
require 'legion/extensions/docker/runners/networks'
|
|
8
|
+
require 'legion/extensions/docker/client'
|
|
9
|
+
|
|
10
|
+
module Legion
|
|
11
|
+
module Extensions
|
|
12
|
+
module Docker
|
|
13
|
+
extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: lex-docker
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Esity
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: base64
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: docker-api
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.0'
|
|
40
|
+
description: Used to connect Legion to Docker
|
|
41
|
+
email:
|
|
42
|
+
- matthewdiverson@gmail.com
|
|
43
|
+
executables: []
|
|
44
|
+
extensions: []
|
|
45
|
+
extra_rdoc_files: []
|
|
46
|
+
files:
|
|
47
|
+
- ".github/workflows/ci.yml"
|
|
48
|
+
- ".gitignore"
|
|
49
|
+
- ".rspec"
|
|
50
|
+
- ".rubocop.yml"
|
|
51
|
+
- CHANGELOG.md
|
|
52
|
+
- Gemfile
|
|
53
|
+
- lex-docker.gemspec
|
|
54
|
+
- lib/legion/extensions/docker.rb
|
|
55
|
+
- lib/legion/extensions/docker/client.rb
|
|
56
|
+
- lib/legion/extensions/docker/helpers/client.rb
|
|
57
|
+
- lib/legion/extensions/docker/runners/containers.rb
|
|
58
|
+
- lib/legion/extensions/docker/runners/images.rb
|
|
59
|
+
- lib/legion/extensions/docker/runners/networks.rb
|
|
60
|
+
- lib/legion/extensions/docker/version.rb
|
|
61
|
+
homepage: https://github.com/LegionIO/lex-docker
|
|
62
|
+
licenses:
|
|
63
|
+
- MIT
|
|
64
|
+
metadata:
|
|
65
|
+
homepage_uri: https://github.com/LegionIO/lex-docker
|
|
66
|
+
source_code_uri: https://github.com/LegionIO/lex-docker
|
|
67
|
+
changelog_uri: https://github.com/LegionIO/lex-docker/blob/main/CHANGELOG.md
|
|
68
|
+
rubygems_mfa_required: 'true'
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
require_paths:
|
|
71
|
+
- lib
|
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '3.4'
|
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
requirements: []
|
|
83
|
+
rubygems_version: 3.6.9
|
|
84
|
+
specification_version: 4
|
|
85
|
+
summary: LEX::Docker
|
|
86
|
+
test_files: []
|