dockerfile-rb 0.1.0
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/rake.yml +20 -0
- data/.github/workflows/release.yml +29 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +37 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/dockerfile-rb.gemspec +33 -0
- data/lib/dockerfile-rb.rb +28 -0
- data/lib/dockerfile-rb/add.rb +19 -0
- data/lib/dockerfile-rb/arg.rb +14 -0
- data/lib/dockerfile-rb/cmd.rb +15 -0
- data/lib/dockerfile-rb/copy.rb +19 -0
- data/lib/dockerfile-rb/entrypoint.rb +21 -0
- data/lib/dockerfile-rb/env.rb +20 -0
- data/lib/dockerfile-rb/expose.rb +15 -0
- data/lib/dockerfile-rb/from.rb +17 -0
- data/lib/dockerfile-rb/grammars/dockerfile.citrus +186 -0
- data/lib/dockerfile-rb/healthcheck.rb +13 -0
- data/lib/dockerfile-rb/label.rb +17 -0
- data/lib/dockerfile-rb/maintainer.rb +13 -0
- data/lib/dockerfile-rb/run.rb +31 -0
- data/lib/dockerfile-rb/stopsignal.rb +13 -0
- data/lib/dockerfile-rb/user.rb +15 -0
- data/lib/dockerfile-rb/version.rb +3 -0
- data/lib/dockerfile-rb/volume.rb +18 -0
- data/lib/dockerfile-rb/workdir.rb +13 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0f7550872225ced2ce677f0e8af5022518091692f9b3e85b8e8bf3a464b54e55
|
4
|
+
data.tar.gz: f6f6bc21c3160f00e9595aa9e8b2933d0143d787bdfaed006699d521cfe267ee
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b52821ac6315a6728aaa172458751a4603089539058425e42a01ce1b035556d22a7ae6b922f056073b5e8ebc9603b5a01eeca762aee8f64c67ffbf296001a269
|
7
|
+
data.tar.gz: b797d2d4510c97a48bee02309ba18a7af726f8266e72913846242f6c6d3811cf3934d1b8ea3fc24fe2838cd4cf2f643ae63e6f15fb88a72b4b5b8c9ffcb143ab
|
@@ -0,0 +1,20 @@
|
|
1
|
+
name: Rake Test
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v1
|
12
|
+
- name: With Ruby 2.6
|
13
|
+
uses: actions/setup-ruby@v1
|
14
|
+
with:
|
15
|
+
ruby-version: 2.6.x
|
16
|
+
- name: Run rake
|
17
|
+
run: |
|
18
|
+
gem install bundler
|
19
|
+
bundle install --jobs 4 --retry 3
|
20
|
+
bundle exec rake
|
@@ -0,0 +1,29 @@
|
|
1
|
+
name: Release Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
create:
|
5
|
+
tags:
|
6
|
+
- v*
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
build:
|
10
|
+
name: Build + Publish
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@v2
|
15
|
+
- name: Set up Ruby 2.6
|
16
|
+
uses: actions/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: 2.6.x
|
19
|
+
|
20
|
+
- name: Publish to RubyGems
|
21
|
+
run: |
|
22
|
+
mkdir -p $HOME/.gem
|
23
|
+
touch $HOME/.gem/credentials
|
24
|
+
chmod 0600 $HOME/.gem/credentials
|
25
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
26
|
+
gem build *.gemspec
|
27
|
+
gem push *.gem
|
28
|
+
env:
|
29
|
+
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
dockerfile-rb (0.1.0)
|
5
|
+
citrus
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
citrus (3.0.2)
|
11
|
+
diff-lcs (1.3)
|
12
|
+
rake (13.0.1)
|
13
|
+
rspec (3.9.0)
|
14
|
+
rspec-core (~> 3.9.0)
|
15
|
+
rspec-expectations (~> 3.9.0)
|
16
|
+
rspec-mocks (~> 3.9.0)
|
17
|
+
rspec-core (3.9.1)
|
18
|
+
rspec-support (~> 3.9.1)
|
19
|
+
rspec-expectations (3.9.0)
|
20
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
21
|
+
rspec-support (~> 3.9.0)
|
22
|
+
rspec-mocks (3.9.1)
|
23
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
24
|
+
rspec-support (~> 3.9.0)
|
25
|
+
rspec-support (3.9.2)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
bundler (~> 1.17)
|
32
|
+
dockerfile-rb!
|
33
|
+
rake (~> 13.0)
|
34
|
+
rspec (~> 3.0)
|
35
|
+
|
36
|
+
BUNDLED WITH
|
37
|
+
1.17.3
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2019 gscho
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# DockerfileRB
|
2
|
+
|
3
|
+

|
4
|
+
|
5
|
+
The intent of this gem is to use a PEG (citrus) to parse a Dockerfile into a Ruby object .
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'dockerfile-rb'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install dockerfile-rb
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
Example usage:
|
26
|
+
|
27
|
+
```
|
28
|
+
require 'dockerfile-rb'
|
29
|
+
|
30
|
+
dockerfile = DockerfileRB.parse('/path/to/Dockerfile')
|
31
|
+
```
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/gscho/dockerfile-rb.
|
36
|
+
|
37
|
+
## License
|
38
|
+
|
39
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "dockerfile/rb"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "dockerfile-rb/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "dockerfile-rb"
|
7
|
+
spec.version = DockerfileRB::VERSION
|
8
|
+
spec.authors = ["gscho"]
|
9
|
+
spec.email = ["greg.c.schofield@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = %q{A Dockerfile parser implemented in ruby}
|
12
|
+
spec.homepage = "https://github.com/gscho/dockerfile-rb"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/gscho/dockerfile-rb"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/gscho/dockerfile-rb/CHANGELOG.md"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) 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_development_dependency "bundler", "~> 1.17"
|
30
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
31
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
32
|
+
spec.add_dependency "citrus"
|
33
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'citrus'
|
2
|
+
require "dockerfile-rb/add"
|
3
|
+
require "dockerfile-rb/arg"
|
4
|
+
require "dockerfile-rb/cmd"
|
5
|
+
require "dockerfile-rb/copy"
|
6
|
+
require "dockerfile-rb/entrypoint"
|
7
|
+
require "dockerfile-rb/env"
|
8
|
+
require "dockerfile-rb/expose"
|
9
|
+
require "dockerfile-rb/healthcheck"
|
10
|
+
require "dockerfile-rb/from"
|
11
|
+
require "dockerfile-rb/label"
|
12
|
+
require "dockerfile-rb/maintainer"
|
13
|
+
require "dockerfile-rb/run"
|
14
|
+
require "dockerfile-rb/stopsignal"
|
15
|
+
require "dockerfile-rb/user"
|
16
|
+
require "dockerfile-rb/version"
|
17
|
+
require "dockerfile-rb/volume"
|
18
|
+
require "dockerfile-rb/workdir"
|
19
|
+
|
20
|
+
Citrus.load "#{File.expand_path('dockerfile-rb/grammars/dockerfile.citrus', __dir__)}"
|
21
|
+
|
22
|
+
module DockerfileRB
|
23
|
+
class Error < StandardError; end
|
24
|
+
|
25
|
+
def self.parse(content)
|
26
|
+
DockerfileRB::Dockerfile.parse(content).value
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Add
|
3
|
+
attr_reader :arg, :name, :user, :group, :src, :dest
|
4
|
+
def initialize(arg, src, dest)
|
5
|
+
string_arg = arg.to_s
|
6
|
+
@arg = string_arg.to_s.split('=')[0] unless string_arg.nil?
|
7
|
+
split_args = string_arg.split(':')
|
8
|
+
@user = split_args[0].gsub(/--.+=/,'') unless split_args[0].nil?
|
9
|
+
@group = split_args[1] unless split_args.nil?
|
10
|
+
@src = src
|
11
|
+
@dest = dest
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module AddParser
|
15
|
+
def value
|
16
|
+
Add.new(capture(:arg_term), capture(:src_term), capture(:dest_term))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Arg
|
3
|
+
attr_reader :name, :default_value
|
4
|
+
def initialize(name, default_value)
|
5
|
+
@name = name
|
6
|
+
@default_value = default_value
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module ArgParser
|
10
|
+
def value
|
11
|
+
Arg.new(capture(:arg_name_term), capture(:arg_value_term))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Cmd
|
3
|
+
attr_reader :executable, :parameters
|
4
|
+
def initialize(executable, parameters)
|
5
|
+
@executable = executable
|
6
|
+
@parameters = parameters
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module CmdParser
|
10
|
+
def value
|
11
|
+
cmd = captures(:cmd_term)
|
12
|
+
Cmd.new(cmd[0], cmd[1..-1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Copy
|
3
|
+
attr_reader :arg, :name, :user, :group, :src, :dest
|
4
|
+
def initialize(arg, src, dest)
|
5
|
+
string_arg = arg.to_s
|
6
|
+
@arg = string_arg.to_s.split('=')[0] unless string_arg.nil?
|
7
|
+
split_args = string_arg.split(':')
|
8
|
+
@user = split_args[0].gsub(/--.+=/,'') unless split_args[0].nil?
|
9
|
+
@group = split_args[1] unless split_args.nil?
|
10
|
+
@src = src
|
11
|
+
@dest = dest
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module CopyParser
|
15
|
+
def value
|
16
|
+
Copy.new(capture(:arg_term), capture(:src_term), capture(:dest_term))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Entrypoint
|
3
|
+
attr_reader :executable, :parameters
|
4
|
+
def initialize(executable, parameters)
|
5
|
+
@executable = executable
|
6
|
+
@parameters = parameters
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module EntrypointExecParser
|
10
|
+
def value
|
11
|
+
entrypoint = captures(:entrypoint_term)
|
12
|
+
Entrypoint.new(entrypoint[0], entrypoint[1..-1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
module EntrypointShellParser
|
16
|
+
def value
|
17
|
+
entrypoint = captures(:entrypoint_term)
|
18
|
+
Entrypoint.new(entrypoint[0], entrypoint[1..-1])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Env
|
3
|
+
attr_reader :pairs
|
4
|
+
def initialize(pairs)
|
5
|
+
@pairs = pairs
|
6
|
+
end
|
7
|
+
end
|
8
|
+
module EnvWhitespaceParser
|
9
|
+
def value
|
10
|
+
Env.new({capture(:key_term).to_s => capture(:value_term).to_s})
|
11
|
+
end
|
12
|
+
end
|
13
|
+
module EnvKeyValueParser
|
14
|
+
def value
|
15
|
+
keys = captures(:key_term).map{ |c| c.value.strip }
|
16
|
+
values = captures(:value_term).map{ |c| c.value.strip }
|
17
|
+
Env.new(Hash[keys.zip(values)])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Expose
|
3
|
+
attr_reader :port, :protocol
|
4
|
+
def initialize(port, protocol)
|
5
|
+
@port = port.to_i
|
6
|
+
@protocol = (protocol || 'tcp').downcase
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module ExposeParser
|
10
|
+
def value
|
11
|
+
expose = capture(:expose_term).to_s.split('/')
|
12
|
+
Expose.new(expose[0], expose[1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class From
|
3
|
+
attr_reader :image, :image_tag, :image_digest, :name
|
4
|
+
def initialize(from_value, as_value)
|
5
|
+
@name = as_value
|
6
|
+
@image = from_value.value.split(':')[0]
|
7
|
+
@image_tag = from_value.value.split(':')[1]
|
8
|
+
@image_digest = from_value.value.split('@')[1]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
module FromParser
|
12
|
+
def value
|
13
|
+
as = capture(:as).value.first unless capture(:as).nil?
|
14
|
+
From.new(capture(:from_term), as)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
grammar DockerfileRB::Dockerfile
|
2
|
+
rule dockerfile
|
3
|
+
(
|
4
|
+
comment |
|
5
|
+
add | add_with_whitespace |
|
6
|
+
arg |
|
7
|
+
copy | copy_with_whitespace |
|
8
|
+
cmd_exec | cmd_shell |
|
9
|
+
entrypoint_exec | entrypoint_shell |
|
10
|
+
env_with_whitespace | env_key_value |
|
11
|
+
expose |
|
12
|
+
healthcheck_none |
|
13
|
+
from |
|
14
|
+
label |
|
15
|
+
maintainer |
|
16
|
+
run_exec |
|
17
|
+
run_shell |
|
18
|
+
stopsignal |
|
19
|
+
user |
|
20
|
+
volume_json |
|
21
|
+
volume_string |
|
22
|
+
workdir |
|
23
|
+
line_break
|
24
|
+
)*
|
25
|
+
{
|
26
|
+
parsed = matches.map(&:value).compact
|
27
|
+
value = Hash.new {|h,k| h[k] = [] }
|
28
|
+
parsed.each{|p| value[p.class.name.split('::').last.downcase].push p }
|
29
|
+
value
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
rule add
|
34
|
+
('ADD' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? src_term:(string) space dest_term:(string) ) <DockerfileRB::AddParser>
|
35
|
+
end
|
36
|
+
|
37
|
+
rule add_with_whitespace
|
38
|
+
('ADD' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? '[' quote src_term:(string_with_whitespace) quote comma quote dest_term:(string_with_whitespace) quote ']' ) <DockerfileRB::AddParser>
|
39
|
+
end
|
40
|
+
|
41
|
+
rule arg
|
42
|
+
('ARG' space arg_name_term:(string) '=' arg_value_term:(string)) <DockerfileRB::ArgParser>
|
43
|
+
end
|
44
|
+
|
45
|
+
rule as
|
46
|
+
('AS' space as_term:(string)) {
|
47
|
+
captures(:as_term)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
rule comment
|
52
|
+
'#' space? (string_with_whitespace | '\'' | '=' | '"')* line_break
|
53
|
+
end
|
54
|
+
|
55
|
+
rule copy
|
56
|
+
('COPY' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? src_term:(string) space dest_term:(string) ) <DockerfileRB::CopyParser>
|
57
|
+
end
|
58
|
+
|
59
|
+
rule copy_with_whitespace
|
60
|
+
('COPY' space arg_term:('--chown=' [a-zA-Z0-9.@/_\-\$\\]+ ':' [a-zA-Z0-9:.@/_\-\$\\]+)? space? '[' quote src_term:(string_with_whitespace) quote comma quote dest_term:(string_with_whitespace) quote ']' ) <DockerfileRB::CopyParser>
|
61
|
+
end
|
62
|
+
|
63
|
+
rule cmd_exec
|
64
|
+
('CMD' space '[' (quote cmd_term:(string) quote comma?)* ']') <DockerfileRB::CmdParser>
|
65
|
+
end
|
66
|
+
|
67
|
+
rule cmd_shell
|
68
|
+
('CMD' space (cmd_term:(string) space?)*) <DockerfileRB::CmdParser>
|
69
|
+
end
|
70
|
+
|
71
|
+
rule entrypoint_exec
|
72
|
+
('ENTRYPOINT' space '[' (quote entrypoint_term:(string) quote comma?)* ']') <DockerfileRB::EntrypointExecParser>
|
73
|
+
end
|
74
|
+
|
75
|
+
rule entrypoint_shell
|
76
|
+
('ENTRYPOINT' space (entrypoint_term:(string) space?)*) <DockerfileRB::EntrypointShellParser>
|
77
|
+
end
|
78
|
+
|
79
|
+
rule env_with_whitespace
|
80
|
+
('ENV' space key_term:(string) space value_term:(string_with_whitespace)) <DockerfileRB::EnvWhitespaceParser>
|
81
|
+
end
|
82
|
+
|
83
|
+
rule env_key_value
|
84
|
+
('ENV' space (key_term:(escaped_string) space? '=' quote? space? value_term:(escaped_string) quote? line_continuation?)+) <DockerfileRB::EnvKeyValueParser>
|
85
|
+
end
|
86
|
+
|
87
|
+
rule expose
|
88
|
+
('EXPOSE' space expose_term:(string)) <DockerfileRB::ExposeParser>
|
89
|
+
end
|
90
|
+
|
91
|
+
rule healthcheck_none
|
92
|
+
'HEALTHCHECK NONE' <DockerfileRB::HealthcheckNoneParser>
|
93
|
+
end
|
94
|
+
|
95
|
+
rule from
|
96
|
+
('FROM' space from_term:(string) space? as?) <DockerfileRB::FromParser>
|
97
|
+
end
|
98
|
+
|
99
|
+
rule label
|
100
|
+
('LABEL' space label_term:(quote? string_with_whitespace quote? '=' quote? string_with_whitespace quote? line_continuation?)+) <DockerfileRB::LabelParser>
|
101
|
+
end
|
102
|
+
|
103
|
+
rule maintainer
|
104
|
+
('MAINTAINER' space maintainer_term:(string)) <DockerfileRB::MaintainerParser>
|
105
|
+
end
|
106
|
+
|
107
|
+
rule run_exec
|
108
|
+
('RUN' space '[' (quote run_term:(string_with_whitespace) quote comma?)* ']') <DockerfileRB::RunExecParser>
|
109
|
+
end
|
110
|
+
|
111
|
+
rule run_shell
|
112
|
+
('RUN' space (run_term:(run_string) space? line_continuation? (comment)*)*) <DockerfileRB::RunShellParser>
|
113
|
+
end
|
114
|
+
|
115
|
+
rule stopsignal
|
116
|
+
('STOPSIGNAL' space signal_term:(signal)) <DockerfileRB::StopsignalParser>
|
117
|
+
end
|
118
|
+
|
119
|
+
rule user
|
120
|
+
('USER' space user_term:(string)) <DockerfileRB::UserParser>
|
121
|
+
end
|
122
|
+
|
123
|
+
rule volume_string
|
124
|
+
('VOLUME' space (volume_term:(string) space?)* (']')?) <DockerfileRB::VolumeStringParser>
|
125
|
+
end
|
126
|
+
|
127
|
+
rule volume_json
|
128
|
+
('VOLUME' space '[' (quote volume_term:(string) quote comma?)* ']') <DockerfileRB::VolumeJSONParser>
|
129
|
+
end
|
130
|
+
|
131
|
+
rule workdir
|
132
|
+
('WORKDIR' space quote? workdir_term:(path) quote?) <DockerfileRB::WorkdirParser>
|
133
|
+
end
|
134
|
+
|
135
|
+
rule path
|
136
|
+
[a-zA-Z0-9:.@/_\-\$\[\]\\]+
|
137
|
+
end
|
138
|
+
|
139
|
+
rule string
|
140
|
+
[a-zA-Z0-9:;!#<>*&^,(){}+#.@/_\-\$\[\]\|$?]+
|
141
|
+
end
|
142
|
+
|
143
|
+
rule string_with_whitespace
|
144
|
+
(string | ' ')+
|
145
|
+
end
|
146
|
+
|
147
|
+
rule escaped_string
|
148
|
+
(escape? string_with_whitespace escape?)+
|
149
|
+
end
|
150
|
+
|
151
|
+
rule run_string
|
152
|
+
[a-zA-Z0-9:;!#<>*&^,(){}+#.@/_\-\$\[\]\|$ ='"?]+ | '\\'
|
153
|
+
end
|
154
|
+
|
155
|
+
rule comma
|
156
|
+
space? ',' space?
|
157
|
+
end
|
158
|
+
|
159
|
+
rule escape
|
160
|
+
('\\' &' ')*
|
161
|
+
end
|
162
|
+
|
163
|
+
rule quote
|
164
|
+
space? '"' space?
|
165
|
+
end
|
166
|
+
|
167
|
+
rule line_continuation
|
168
|
+
space? '\\' space? line_break
|
169
|
+
end
|
170
|
+
|
171
|
+
rule space
|
172
|
+
[ \t]*
|
173
|
+
end
|
174
|
+
|
175
|
+
rule indent
|
176
|
+
[ \t\r\n]*
|
177
|
+
end
|
178
|
+
|
179
|
+
rule line_break
|
180
|
+
(space? "\n" | space? "\r\n") { nil }
|
181
|
+
end
|
182
|
+
|
183
|
+
rule signal
|
184
|
+
[\d] | "SIG"[A-Z]+
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Label
|
3
|
+
attr_reader :pairs
|
4
|
+
def initialize(pairs)
|
5
|
+
@pairs = pairs
|
6
|
+
end
|
7
|
+
end
|
8
|
+
module LabelParser
|
9
|
+
def value
|
10
|
+
delimiters = ['=', "\""]
|
11
|
+
labels = capture(:label_term).to_s.split(Regexp.union(delimiters))
|
12
|
+
.reject { |capture| capture.empty? }
|
13
|
+
.map { |capture| capture.gsub("\n",'').gsub('\\','').strip }
|
14
|
+
Label.new(Hash[*labels])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Run
|
3
|
+
attr_reader :executable, :parameters, :command
|
4
|
+
def initialize
|
5
|
+
end
|
6
|
+
|
7
|
+
def shell(command)
|
8
|
+
@command = command
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def exec(executable, parameters)
|
13
|
+
@executable = executable
|
14
|
+
@parameters = parameters
|
15
|
+
self
|
16
|
+
end
|
17
|
+
end
|
18
|
+
module RunExecParser
|
19
|
+
def value
|
20
|
+
run = captures(:run_term)
|
21
|
+
Run.new.exec(run[0], run[1..-1])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
module RunShellParser
|
25
|
+
def value
|
26
|
+
run = captures(:run_term)
|
27
|
+
run.each { |r| r.string.strip! }
|
28
|
+
Run.new.shell(run.join(' '))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class User
|
3
|
+
attr_reader :user_id, :group_id
|
4
|
+
def initialize(user, group)
|
5
|
+
@user_id = user
|
6
|
+
@group_id = group
|
7
|
+
end
|
8
|
+
end
|
9
|
+
module UserParser
|
10
|
+
def value
|
11
|
+
user = capture(:user_term).value.split(':')
|
12
|
+
User.new(user[0], user[1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DockerfileRB
|
2
|
+
class Volume
|
3
|
+
attr_reader :directories
|
4
|
+
def initialize(directories)
|
5
|
+
@directories = directories
|
6
|
+
end
|
7
|
+
end
|
8
|
+
module VolumeStringParser
|
9
|
+
def value
|
10
|
+
Volume.new(captures(:volume_term))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
module VolumeJSONParser
|
14
|
+
def value
|
15
|
+
Volume.new(captures(:volume_term))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dockerfile-rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- gscho
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.17'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.17'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '13.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '13.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: citrus
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- greg.c.schofield@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".github/workflows/rake.yml"
|
77
|
+
- ".github/workflows/release.yml"
|
78
|
+
- ".gitignore"
|
79
|
+
- ".rspec"
|
80
|
+
- ".travis.yml"
|
81
|
+
- Gemfile
|
82
|
+
- Gemfile.lock
|
83
|
+
- LICENSE.txt
|
84
|
+
- README.md
|
85
|
+
- Rakefile
|
86
|
+
- bin/console
|
87
|
+
- bin/setup
|
88
|
+
- dockerfile-rb.gemspec
|
89
|
+
- lib/dockerfile-rb.rb
|
90
|
+
- lib/dockerfile-rb/add.rb
|
91
|
+
- lib/dockerfile-rb/arg.rb
|
92
|
+
- lib/dockerfile-rb/cmd.rb
|
93
|
+
- lib/dockerfile-rb/copy.rb
|
94
|
+
- lib/dockerfile-rb/entrypoint.rb
|
95
|
+
- lib/dockerfile-rb/env.rb
|
96
|
+
- lib/dockerfile-rb/expose.rb
|
97
|
+
- lib/dockerfile-rb/from.rb
|
98
|
+
- lib/dockerfile-rb/grammars/dockerfile.citrus
|
99
|
+
- lib/dockerfile-rb/healthcheck.rb
|
100
|
+
- lib/dockerfile-rb/label.rb
|
101
|
+
- lib/dockerfile-rb/maintainer.rb
|
102
|
+
- lib/dockerfile-rb/run.rb
|
103
|
+
- lib/dockerfile-rb/stopsignal.rb
|
104
|
+
- lib/dockerfile-rb/user.rb
|
105
|
+
- lib/dockerfile-rb/version.rb
|
106
|
+
- lib/dockerfile-rb/volume.rb
|
107
|
+
- lib/dockerfile-rb/workdir.rb
|
108
|
+
homepage: https://github.com/gscho/dockerfile-rb
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata:
|
112
|
+
homepage_uri: https://github.com/gscho/dockerfile-rb
|
113
|
+
source_code_uri: https://github.com/gscho/dockerfile-rb
|
114
|
+
changelog_uri: https://github.com/gscho/dockerfile-rb/CHANGELOG.md
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- lib
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
requirements: []
|
130
|
+
rubygems_version: 3.0.3
|
131
|
+
signing_key:
|
132
|
+
specification_version: 4
|
133
|
+
summary: A Dockerfile parser implemented in ruby
|
134
|
+
test_files: []
|