docker inspect â docker run
Reverse engineer a docker run
command from an existing container (via docker inspect
).
rekcod
can turn any of the following into a docker run
command:
- container ids/names (
rekcod
will calldocker inspect
) - path to file containing
docker inspect
output - raw JSON (pass the
docker inspect
output directly)
Each docker run
command can be used to duplicate the containers.
This is not super robust, but it should cover most arguments needed. See Fields Supported below.
When passing container ids/names, this module calls docker inspect
directly, and the user running it should be able to as well.
(If you didn't notice, the dumb name for this package is just "docker" in reverse.)
Install and Usage
CLI
If you have Node installed:
$ npm i -g rekcod
If you only have Docker installed:
$ docker pull nexdrew/rekcod
$ alias rekcod="docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod"
Or you can simply run this, no installation required:
$ docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod <container>
Containers
# containers as arguments
$ rekcod container-one 6653931e39f2 happy_torvalds
docker run --name container-one ...
docker run --name stinky_jones ...
docker run --name happy_torvalds ...
# pipe in containers
$ docker ps -aq | rekcod
docker run --name container-one ...
docker run --name stinky_jones ...
docker run --name happy_torvalds ...
Files
If you are using the Node CLI - i.e. you installed rekcod
via npm or yarn - you can pass file names or file contents to rekcod
as is, since the Node CLI will have access to files on the host file system:
# file names as arguments (Node CLI example)
$ docker inspect container-one > one.json
$ docker inspect 6653931e39f2 happy_torvalds > two.json
$ rekcod one.json two.json
docker run --name container-one ...
docker run --name stinky_jones ...
docker run --name happy_torvalds ...
# pipe in file names (Node CLI example)
$ docker inspect container-one > one.json
$ docker inspect 6653931e39f2 happy_torvalds > two.json
$ ls *.json | rekcod
If you are using the Docker-only version of rekcod
- i.e. you are using docker run
to run the nexdrew/rekcod
image - then note that you'll need to bind mount files from the host file system as volumes on the rekcod
container in order for the containerized executable to read them:
# file names as arguments (Docker-only example)
$ docker inspect container-one > one.json
$ docker run --rm -i -v /var/run/docker.sock:/var/run/docker.sock -v `pwd`/one.json:/one.json nexdrew/rekcod /one.json
docker run --name container-one ...
Otherwise, as long as you read the file from the host system, you can pipe the contents of a file to rekcod
and either installation method will work:
# pipe in file contents (works for Node CLI or Docker-only alias)
$ cat one.json | rekcod
JSON
$ docker inspect container-one 6653931e39f2 | rekcod
docker run --name container-one ...
docker run --name stinky_jones ...
Module
$ npm i --save rekcod
reckod()
Containers via async const rekcod = require('rekcod')
// single container
rekcod('container-name', (err, run) => {
if (err) return console.error(err)
console.log(run[0].command)
})
// multiple containers
rekcod(['another-name', '6653931e39f2', 'happy_torvalds'], (err, run) => {
if (err) return console.error(err)
run.forEach((r) => {
console.log('\n', r.command)
})
})
rekcod.readFile()
File via async const rekcod = require('rekcod')
rekcod.readFile('docker-inspect.json', (err, run) => {
if (err) return console.error(err)
run.forEach((r) => {
console.log('\n', r.command)
})
})
rekcod.parse()
Parse a JSON string via sync const fs = require('fs')
const rekcod = require('rekcod')
let array
try {
array = rekcod.parse(fs.readFileSync('docker-inspect.json', 'utf8'))
} catch (err) {
return console.error(err)
}
array.forEach((r) => {
console.log('\n', r.command)
})
Fields Supported
rekcod
will translate the following docker inspect
fields into the listed docker run
arguments.
docker inspect | docker run |
---|---|
Name |
--name |
HostConfig.Privileged |
--privileged |
HostConfig.Runtime |
--runtime |
HostConfig.Binds |
-v |
HostConfig.VolumesFrom |
--volumes-from |
HostConfig.PortBindings |
-p |
HostConfig.Links |
--link |
HostConfig.PublishAllPorts |
-P |
HostConfig.NetworkMode |
--net |
HostConfig.UTSMode |
--uts |
HostConfig.RestartPolicy |
--restart |
HostConfig.ExtraHosts |
--add-host |
HostConfig.GroupAdd |
--group-add |
HostConfig.PidMode |
--pid |
HostConfig.SecurityOpt |
--security-opt |
Config.Hostname |
-h |
Config.Domainname |
--domainname |
Config.ExposedPorts |
--expose |
Config.Labels |
-l |
Config.Env |
-e |
Config.Attach * !== true |
-d |
Config.AttachStdin |
-a stdin |
Config.AttachStdout |
-a stdout |
Config.AttachStderr |
-a stderr |
Config.Tty |
-t |
Config.OpenStdin |
-i |
Config.Entrypoint |
--entrypoint |
Config.Image || Image |
image name or id |
Config.Cmd |
command and args |
Prior to version 0.2.0, rekcod
always assumed -d
for detached mode, but it now uses that only when all stdio options are not attached. I believe this is the correct behavior, but let me know if it causes you problems. A side effect of this is that the -d
shows up much later in the docker run
command than it used to, but it will still be there.
License
ISC Š Contributors