Skip to content

🐳 parse & print a Dockerfile as JSON, or query (e.g. extract base images) using JSONPath. #golang #cli - single binary, no dependencies. linux, osx, windows.

License

Notifications You must be signed in to change notification settings

keilerkonzept/dockerfile-json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

dockerfile-json

Prints Dockerfiles as JSON to stdout, optionally evaluates build args. Uses the official Dockerfile parser from buildkit. Plays well with jq.

Contents

Get it

Using go get:

go get -u github.com/keilerkonzept/dockerfile-json

Or download the binary for your platform from the releases page.

Usage

CLI

dockerfile-json [PATHS...]

Usage of dockerfile-json:
  -build-arg value
    	a key/value pair KEY[=VALUE]
  -expand-build-args
    	expand build args (default true)
  -jsonpath string
    	select parts of the output using JSONPath (https://goessner.net/articles/JsonPath)
  -jsonpath-raw
    	when using JSONPath, output raw strings, not JSON values
  -quiet
    	suppress log output (stderr)

Examples

JSON output

Dockerfile

ARG ALPINE_TAG=3.10

FROM alpine:$ALPINE_TAG AS build
RUN echo "Hello world" > abc

FROM build AS test
RUN echo "foo" > bar

FROM scratch
COPY --from=build --chown=nobody:nobody abc .
CMD ["echo"]
$ dockerfile-json Dockerfile | jq .
{
  "MetaArgs": [
    {
      "Key": "ALPINE_TAG",
      "DefaultValue": "3.10",
      "ProvidedValue": null,
      "Value": "3.10"
    }
  ],
  "Stages": [
    {
      "Name": "build",
      "BaseName": "alpine:3.10",
      "SourceCode": "FROM alpine:${ALPINE_TAG} AS build",
      "Platform": "",
      "Location": [
        {
          "Start": {
            "Line": 3,
            "Character": 0
          },
          "End": {
            "Line": 3,
            "Character": 0
          }
        }
      ],
      "Comment": "",
      "As": "build",
      "From": {
        "Image": "alpine:3.10"
      },
      "Commands": [
        {
          "CmdLine": [
            "echo \"Hello world\" > abc"
          ],
          "Files": null,
          "FlagsUsed": [],
          "Name": "RUN",
          "PrependShell": true
        }
      ]
    },
    {
      "Name": "test",
      "BaseName": "build",
      "SourceCode": "FROM build AS test",
      "Platform": "",
      "Location": [
        {
          "Start": {
            "Line": 6,
            "Character": 0
          },
          "End": {
            "Line": 6,
            "Character": 0
          }
        }
      ],
      "Comment": "",
      "As": "test",
      "From": {
        "Stage": {
          "Named": "build",
          "Index": 0
        }
      },
      "Commands": [
        {
          "CmdLine": [
            "echo \"foo\" > bar"
          ],
          "Files": null,
          "FlagsUsed": [],
          "Name": "RUN",
          "PrependShell": true
        }
      ]
    },
    {
      "Name": "",
      "BaseName": "scratch",
      "SourceCode": "FROM scratch",
      "Platform": "",
      "Location": [
        {
          "Start": {
            "Line": 9,
            "Character": 0
          },
          "End": {
            "Line": 9,
            "Character": 0
          }
        }
      ],
      "Comment": "",
      "From": {
        "Scratch": true
      },
      "Commands": [
        {
          "Chmod": "",
          "Chown": "nobody:nobody",
          "DestPath": ".",
          "From": "build",
          "Name": "COPY",
          "SourceContents": null,
          "SourcePaths": [
            "abc"
          ]
        },
        {
          "CmdLine": [
            "echo"
          ],
          "Files": null,
          "Name": "CMD",
          "PrependShell": false
        }
      ]
    }
  ]
}

Extract build stage names

Dockerfile

FROM maven:alpine AS build
# ...

FROM build AS test
# ...

FROM openjdk:jre-alpine
# ...
$ dockerfile-json --jsonpath=..As Dockerfile
"build"
"test"

Extract base images

Dockerfile

ARG ALPINE_TAG=3.10
ARG APP_BASE=scratch

FROM alpine:$ALPINE_TAG AS build
# ...

FROM build
# ...

FROM $APP_BASE
# ...

Expand build args, omit stage aliases and scratch

Using jq:

$ dockerfile-json Dockerfile |
    jq '.Stages[] | select(.From | .Stage or .Scratch | not) | .BaseName'
"alpine:3.10"

Using --jsonpath:

$ dockerfile-json --jsonpath=..Image Dockerfile
"alpine:3.10"

Using --jsonpath, --jsonpath-raw output:

$ dockerfile-json --jsonpath=..Image --jsonpath-raw Dockerfile
alpine:3.10

Set build args, omit stage aliases and scratch

$ dockerfile-json --build-arg ALPINE_TAG=hello-world --jsonpath=..Image Dockerfile
"alpine:hello-world"

Expand build args, include all base names

$  dockerfile-json --jsonpath=..BaseName Dockerfile
"alpine:3.10"
"build"
"scratch"

Ignore build args, include all base names

$ dockerfile-json --expand-build-args=false --jsonpath=..BaseName Dockerfile
"alpine:${ALPINE_TAG}"
"build"
"${APP_BASE}"

About

🐳 parse & print a Dockerfile as JSON, or query (e.g. extract base images) using JSONPath. #golang #cli - single binary, no dependencies. linux, osx, windows.

Topics

Resources

License

Stars

Watchers

Forks

Packages