我使用第三方GUI(Synology Docker软件包)来设置docker容器。但是,它的限制使我需要从命令行运行容器。 (我想映射另一个主机ip以绑定端口)
现在,由于已经有很多设置已经完成,我想检索启动此容器的原始运行命令,然后我可以将端口映射端口更改为新端口。例如。 “docker run -p 80:8080 gitlab
”
我找不到办法,事件使用“docker inspect”,没有提供此类信息。
请提供一些建议来解决这个问题。
答案 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 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
答案 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']
答案 10 :(得分:0)
要反转docker run命令,还有以下npm软件包。
答案 11 :(得分:0)
所有docker文件都在这里,例如,您可以找到cmd和挂载
ls -la /proc/1
只是喜欢它
cat /proc/1/cmdline
nginx: master process nginx -g daemon off;