我使用第三方GUI(Synology Docker软件包)来设置Docker容器。但是,它的局限性使我需要从命令行运行容器。(我想映射另一个主机IP绑定端口)
现在,由于已经完成了许多设置,因此我想检索启动该容器的原始运行命令,然后可以将端口映射端口更改为新端口。例如。”docker run -p 80:8080 gitlab
”
我找不到这样做的方法,事件使用“ docker inspect”,未提供此类信息。
请提供一些建议以解决此问题。
我使用第三方GUI(Synology Docker软件包)来设置Docker容器。但是,它的局限性使我需要从命令行运行容器。(我想映射另一个主机IP绑定端口)
现在,由于已经完成了许多设置,因此我想检索启动该容器的原始运行命令,然后可以将端口映射端口更改为新端口。例如。”docker run -p 80:8080 gitlab
”
我找不到这样做的方法,事件使用“ docker inspect”,未提供此类信息。
请提供一些建议以解决此问题。
Answers:
那么如何反向工程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
docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
$ 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 inspect <CONTAINER> | jq ".[0].Config.Cmd"
"Cmd": null,
也许这仅在容器没有自动启动为docker daemon的情况下有效吗?
我编写了一个简单的基于节点的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
一个更简单的(?)替代方案是运行此docker inspect模板,该模板使用内置的Go模板功能来输出docker run
兼容命令。该模板仅包含最常用的命令行选项,但可以轻松扩展。
该解决方案除Docker本身外,不依赖于其他工具。
使用以下命令获取所有容器的参数 docker inspect -f“ {{.Name}} {{.Path}} {{.Args}}” $(docker ps -a -q)
目前看来,我们必须先进行“ docker inspect”,然后手动重新创建运行命令。
我发现有人试图编写bash脚本来执行此操作:https : //gist.github.com/miracle2k/c85b7b077fdb8d54bc89
但它不完整,取决于jq。
可能更简单(可靠)的选择是使用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
如果您不想在当前正在运行的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命令未在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