如何显示Docker容器的运行命令

我使用第三方graphics用户界面(Synology Docker软件包)来设置Docker容器。 但是,它的限制使我需要从命令行运行容器。 (我想映射另一个主机IP来绑定端口)

现在,由于已经完成了很多设置,我想检索启动该容器的原始运行命令,然后我可以将端口映射端口更改为新的。 例如。 “ docker run -p 80:8080 gitlab

我找不到办法,事件使用“docker检查”,没有提供这样的信息。

请提供一些build议来解决这个问题。

那么如何逆向工程docker run命令呢?

有一个github版本库试图反向工程docker运行命令,但目前还不完善,版本是0.1.2 。 您应该按照更新。 也许有一天,你可以用它来获得正确的运行命令。

 $ 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存储库: runlike

我写了一个简单的基于节点的CLI工具来从现有容器生成一个docker run命令。

https://www.npmjs.com/package/rekcod

这是一个例子:

 $ 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" 

还处理链接和安装卷和其他的东西。

目前还不是非常强大,但是处理的东西比其他一些提到的要多,而且更多的是我所期待的。

一个更简单的(?)替代scheme是运行这个docker inspect模板 ,该模板使用内置的Go模板function来输出docker run compatible命令。 该模板只涵盖了最常用的命令行选项,但可以轻松扩展。

除了docker本身之外,这个解决scheme不依赖于其他工具。

什么可能是一个更简单(健壮)的select将是使用像bash-preexec的东西来捕获以“docker运行”开始的命令。 然后,您可以将这些命令存储在某处并稍后检索它们。

例如,你可以在你的bashconfiguration文件中添加这样的内容:

 [[ -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 $@ } 

那么你可以运行你的东西:

 source ~/.bash_profile docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image docker run -d daemon docker_ps_mod 

哪些产出:

 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 

该Docker运行命令没有在Dockerfile或任何其他docker相关的文档中指定。

您可以在与您的容器关联的文档中find示例,或者您可以推断docker运行(至less对于命令和端口映射)一个docker ps -a (但不会为您提供可能的--volumes-from选项)

检查/usr/syno/etc/packages/Docker-GitLab/config

这与gitlabconfiguration本身不同,在Synology上可以在/usr/syno/etc/packages/Docker/synology_gitlab.config

目前看来,我们必须去“docker检查”,然后手动重新创build运行命令。

我发现有人试图写一个bash脚本来做到这一点: https : //gist.github.com/miracle2k/c85b7b077fdb8d54bc89

但它是不完整的,取决于jq。

使用docker检查 :

 $ docker inspect foo/bar [ { # … "Config": { # … "Cmd": [ "/usr/local/bin/script.sh" ], # … } } ] 

你可以用jq来编程parsing:

 $ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]' /usr/local/bin/script.sh 

如果你不想在当前正在运行的Docker服务器设置中安装任何东西,你可以简单地执行(用你想要运行参数的容器名replace$CONTAINER_NAME ):

 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" 

(对于rekcod方法 )

要么

 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" 

(对于runlike方法 )