如何显示一个泊位容器的 run 命令

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

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

我找不到这样做的方式,事件使用“码头检查”,没有这样的信息提供。

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

165846 次浏览

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

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

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

这与 Gitlab 配置本身,在 Sylogy 上的不同之处在 /usr/syno/etc/packages/Docker/synology_gitlab.config

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

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

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

更新:

在不安装的情况下运行(谢谢@tilo)

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

或者设置别名,并将其放入 shell 的配置文件中

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


docker ps


runlike YOUR-CONTAINER

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

我发现有人正在尝试编写 bash 脚本来完成这项工作: Https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

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

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

更简单的(?)另一种方法是运行 这个码头检查模板,它使用内置的 Go 模板功能来输出与 docker run兼容的命令。该模板只包含最常见的命令行选项,但是可以很容易地对其进行扩展。

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

docker inspect \
--format "$(curl -s https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" \
name_or_id_of_your_running_container

更简单(健壮)的选项是使用类似于 Bash-preexec的命令来捕获以“ docker 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

使用 码头检查:

$ 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

如果您不想在当前运行的 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 )

要逆转 docker run 命令,还有以下 npm 包。

Https://github.com/nexdrew/rekcod

使用以下命令获取所有容器的参数:

docker inspect -f "\{\{.Name}} \{\{.Path}} \{\{.Args}}" $(docker ps -a -q)

所有的 docker 文件都在这里,你可以找到 cmd 和挂载例如 ls -la /proc/1 猫咪就行了

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

正如@Chris _ Lamb 所指出的,您可以使用 docker check 来查看这一点以及更多内容。 下面是如何将这些信息加载到 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