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


102

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

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

我找不到这样做的方法,事件使用“ docker inspect”,未提供此类信息。

请提供一些建议以解决此问题。



6
@capitalistpug这个问题与这个问题正好相反- 与容器的命令有关,这与用于启动容器的问题有关。
Niels Keurentjes '16

历史| grep'docker run'–
Adrian

1
令人惊奇的是,Docker没有为此提供内置选项。
Macindows

Answers:


132

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

有一个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

或设置别名

alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock 
 assaflavie/runlike"

runlike YOUR-CONTAINER

1
在Synology DSM上设置类似run的操作有点困难,但是我会尝试的。谢谢!
于瑜

1
我不得不使用sudo pip install runlike
Simon,

您实现了@JackYu并将其安装在Sysnology中吗?
xedo

runlike为我们节省=>❤️大量的时间
mtt2p

21
运行方式:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo

30

使用docker inspect

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

您可以使用jq以编程方式对此进行解析:

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

是的,我也喜欢jq,在命令上稍作调整(键入和阅读恕我直言有点容易)是: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll

1
"Cmd": null,也许这仅在容器没有自动启动为docker daemon的情况下有效吗?
迈克尔

23

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

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

目前尚不十分强大,但处理的能力比其他提到的要多,这正是我所寻找的。

编辑:在单个命令中,无需安装任何软件:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container


5

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


1
该列表中的命令和参数运行什么内部的容器,而不是如何将容器开始(即回答您发布的runlike答案4分钟后这个问题!:))。
OzgurH


3

可能更简单(可靠)的选择是使用bash-preexec之的东西来捕获以“ run”开头的命令。然后,您可以将这些命令存储在某个位置,以便以后检索。

例如,您可以在bash个人资料中添加以下内容:

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

有趣的选择。+1
VonC

Docker不记录命令历史记录并且具有这样的简单管道是荒谬的。
Macindows

3

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

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方法


2

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

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

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

这与gitlab配置本身不同,后者在Synology上可用/usr/syno/etc/packages/Docker/synology_gitlab.config


感谢您提及Synology Docker的配置文件位置。但是配置无济于事。它的内容与您从Web UI导出容器的内容几乎相同。
杰克宇


0

所有的docker文件都在这里,您可以找到cmd和挂载,例如 ls -la /proc/1 只需要猫

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.