How to show the run command of a docker container
DockerDocker Problem Overview
I use a third party GUI (Synology Docker package) to setup a docker container. However, it's limitation makes me need to run the container from the command line. (I want to map another host ip to bind the port)
Now, since there are lots of settings that already done, I would like to retrieve the original run command that start this container, then I can change the port mapping port to new one. eg. "docker run -p 80:8080 gitlab
"
I can't find the way to do so, event use "docker inspect", no such information provided.
Please provide some advice to solve this problem.
Docker Solutions
Solution 1 - Docker
> So how to reverse engineering docker run command?
There is a github repository which try to reverse engineering docker run command, but it is not perfect currently, version is 0.1.2
. You should follow it for updating. Maybe one day you can use it to get correct run command with it.
$ sudo pip install runlike
# run the ubuntu image
$ docker run -ti ubuntu bash
$ docker ps -a
# suppose you get the container ID 1dfff2ba0226
# Run runlike to get the docker run command.
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash
Github repository: runlike
Updates:
Run without installing (Thanks @tilo)
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro \
assaflavie/runlike YOUR-CONTAINER
or set alias and put it in your shell's profile
alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro assaflavie/runlike"
docker ps
runlike YOUR-CONTAINER
Solution 2 - Docker
Use docker inspect:
$ docker inspect foo/bar
[
{
# …
"Config": {
# …
"Cmd": [
"/usr/local/bin/script.sh"
],
# …
}
}
]
You can programatically parse this with jq:
$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Solution 3 - Docker
I wrote a simple Node-based CLI tool to generate a docker run
command from an existing container.
https://www.npmjs.com/package/rekcod
Here's an example:
$ npm i -g rekcod
$ rekcod redis_container
docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"
Also handles links and mounted volumes and other stuff.
Not super robust at the moment, but handles more than some of the other things mentioned, and it was more of what I was looking for.
EDIT: In a single command, without installing any software:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container
Solution 4 - Docker
A simpler (?) alternative is to run this docker inspect template, which uses the builtin Go templating capabilities to output a docker run
compatible command. The template only covers the most usual command-line options, but it can easily be extended.
This solution has no dependencies on other tools, except docker itself.
docker inspect \
--format "$(curl -s https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" \
name_or_id_of_your_running_container
Solution 5 - Docker
Use following command to get the arguments for all containers:
docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Solution 6 - Docker
Currently it seems we have to go 'docker inspect
I have found someone attempting to write a bash script to do this: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89
but it is incomplete and depends on jq.
Solution 7 - Docker
If you do not want to install anything into your current running Docker server setup, you can simply execute (replace $CONTAINER_NAME
with the container name you want to have the run arguments):
docker run -it --rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"
(for the rekcod
method)
or
docker run -it --rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"
(for the runlike
method)
Solution 8 - Docker
What could be a simpler (robust) option would be to use something like bash-preexec to capture commands that start with "docker run". You could then store these commands somewhere and retrieve them later.
For example, you could add something like this in your bash profile:
[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
docker_run_history=~/.docker_run_history
docker_clear_history(){
echo -n > $docker_run_history
}
docker_search_history(){
search_for="$@"
[[ -z $search_for ]] && search_for=".*"
\cat $docker_run_history | grep "$search_for" | tail -1
}
docker_ps_mod(){
for c in $(docker ps --format "{{.Image}}"); do
echo "Container $c was run using:"
echo -e "\t$(docker_search_history $c)"
done
}
docker_hook(){
if [[ $@ =~ ^"docker run".*$ ]]; then
\echo "$@" >> $docker_run_history
fi
}
preexec(){
docker_hook $@
}
Then you could just run your things:
source ~/.bash_profile
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
docker run -d daemon
docker_ps_mod
Which outputs:
Container image was run using:
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
Container daemon was run using:
docker run -d daemon
Solution 9 - Docker
That docker run command isn't specified in the Dockerfile or any other docker-related documents.
Either you find an example in the documentation associated to your container, or you can infer that docker run with (at least for the command and port mapping) a docker ps -a
(but that won't give you the possible --volumes-from
options)
Check also /usr/syno/etc/packages/Docker-GitLab/config
This differ from the gitlab config itself, which on Synology is available in /usr/syno/etc/packages/Docker/synology_gitlab.config
Solution 10 - Docker
To reverse the docker run command there is also the following npm package.
Solution 11 - Docker
As noted by @Chris_Lamb, you can use docker inspect to see this and much more. Here is how to load this info to a python dictionary:
import subprocess,json
im_inspect = subprocess.check_output(["docker", "image", "inspect", "datalab-nginx-ui"])
# print(im_inspect.decode("utf-8") ) #if you want to print it
d_inspect = json.loads(im_inspect)
d_inspect
d_inspect[-1]['ContainerConfig']['Cmd']
Solution 12 - Docker
All docker files are here you can find cmd and mounts for example
ls -la /proc/1
just cat it
cat /proc/1/cmdline
nginx: master process nginx -g daemon off;