Aids you creating a `Dockerfile` by transforming its (interactive shell) history into `RUN` instructions
MIT License
Let's create a new image, on an existing repository, to install bash:
host $ cd <repository path>
host $ ship alpine:latest
container $ apk add --no-cache bash
container $ exit
Dockerfile written successfully!
host $ cat Dockerfile
# Generated by https://github.com/augustohp/ship
FROM alpine:latest
LABEL maintainer="Augusto Pascutti <[email protected]>"
RUN apk add --no-cache bash
What happened?
bash
(prefered) or ash
shell are detected and history configured/home/developer
history
of the container was converted to RUN
instructions in the Dockefile
LABEL maintainer
, if they are availableSupported images are (other images might work if they have bash
available):
This is a single-file script, you can rename it freely to anything memorable for you. An easy one-line install is available through sinister:
sh <(curl -sSL https://git.io/fjjvu) --name ship --local --chmod 755 --url https://git.io/fjhO5
The above one-liner will install the script just for the current user. If you
want it globally, remove --local
option.
You should be able to execute ship
now, for example ship --help
:
Usage: ship [-o <filename>] [-f] <image>
ship <-d | --detect-shell> <image>
ship <-h | --help>
ship <-v | --version>
Eases the creation of a Dockerfile by transforming the history
into RUN instructions.
Arguments:
image The name of Dockerimage to be executed.
The image must have bash installed.
Options:
-o | --out <filename> The name of the Dockerfile to be creared.
Default: Dockerfile.
-f | --force Re-creates Dockerfile if it
already exists.
-d | --detect-shell Outputs the shell available in the image.
Shells tested: bash ash
Requirements, trying to be minimal, are:
maintainer
label in the Dockerfile
bash
, for example)There is a Makefile
to automate checks on the script:
make lint
runs shellcheck
make test
runs bats testsFeel free to hack the ship
script. It uses sh
not bash
to run, so try to
avoid bashisms. Almost everything inside the script is on a function to be
friendly even if you've never done any shell-scripting before.
Please, feel free to report bugs, ideas or feature requests through an issue.