如何显示docker容器的run命令

时间:2015-09-24 10:15:04

标签: docker

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

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

我找不到办法,事件使用“docker inspect”,没有提供此类信息。

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

12 个答案:

答案 0 :(得分:84)

  

那么如何逆转工程码头运行命令?

有一个github存储库尝试逆转工程docker run命令,但目前还不完善,版本为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

更新

无需安装即可运行(谢谢@tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

答案 1 :(得分:15)

我编写了一个简单的基于节点的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"

还处理链接和已安装的卷以及其他内容。

目前还不是非常强大,但处理的不仅仅是其他一些提到的东西,而且更多的是我正在寻找的东西。

答案 2 :(得分:14)

使用docker inspect

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

您可以使用jq

以编程方式解析此问题
var MyMap map[string]Example 

type Example struct {
    Id []int
    Name []string
}

答案 3 :(得分:5)

更简单的(?)替代方法是运行this docker inspect template,它使用内置的Go模板功能输出docker run兼容命令。该模板仅涵盖最常用的命令行选项,但可以轻松扩展。

除了docker本身之外,此解决方案不依赖于其他工具。

答案 4 :(得分:4)

目前看来我们必须去码头检查'然后手动重新创建运行命令。

我发现有人试图编写一个bash脚本来执行此操作: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

但它不完整,取决于jq。

答案 5 :(得分:3)

更简单(强大)的选项可能是使用bash-preexec之类的东西来捕获以“docker run”开头的命令。然后,您可以将这些命令存储在某处并稍后检索它们。

例如,您可以在bash配置文件中添加以下内容:

_addGroup  := "NameOfTheGroupToAdd";
_addresses := @If( @IsMember( _addGroup; @ThisValue ); 
                   @ThisValue; 
                   @Trim( @ThisValue : _addGroup ) );
@OptimizeMailAddress(_addresses)

然后你可以运行你的东西:

[[ -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

答案 6 :(得分:3)

使用以下命令获取所有容器的参数 docker inspect -f“ {{.Name}} {{.Path}} {{.Args}}” $(docker ps -a -q)

答案 7 :(得分:2)

Dockerfile或任何其他与docker相关的文档中未指定docker run命令。

要么在与容器关联的文档中找到一个示例,要么可以推断出docker与docker ps -a一起运行(至少对于命令和端口映射)(但这不会给你提供--volumes-from选项)

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

这与/usr/syno/etc/packages/Docker/synology_gitlab.config

中提供的gitlab config itself, which on Synology不同

答案 8 :(得分:1)

如果您不想在当前运行的Docker服务器设置中安装任何内容,只需执行(将$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 method

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 method

答案 9 :(得分:1)

正如@Chris_Lamb 所指出的,您可以使用 docker inspect 来查看这一点以及更多内容。 以下是如何将此信息加载到 python 字典中:

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']

示例运行: enter image description here

答案 10 :(得分:0)

要反转docker run命令,还有以下npm软件包。

https://github.com/nexdrew/rekcod

答案 11 :(得分:0)

所有docker文件都在这里,例如,您可以找到cmd和挂载 ls -la /proc/1 只是喜欢它

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;