exec...的docker中的EXEC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了exec...的docker中的EXEC相关的知识,希望对你有一定的参考价值。

参考技术A

我们在应用容器的过程中,无论是在通过Dockerfile在调试构建镜像的过程,还是容器运行一段时间想查看内部结构,我们还是希望能像操作本地机器一样,实时的查看容器内部文件,代码或者日志。或是修改文件,拷贝文件目录等等。
- 访问容器内部,目前有两种方法
1. Docker自带的exec命令  2. Nsenter工具  - 来说说Docker exec 命令方式访问
- 如图所示,简单的ls命令。Linux系统自带的命令都可以通过这种方式运行。文件放错位置了,mv一下,查看log,就cat log.log一下,等等。
Exec加点料
- 简单的操作不能满足我们对他的好奇...  - 我们运行一下 docker exec -ti 61f ps -ef
- 发现只有3个进程,进程1是CMD命令启动的脚本;进程2是脚本启动的程序;进程3是我们运行ps -ef的进程。  - 出于好奇,我又docker exec 9fe0 kill 15
- 容器从此就停止了...  - 原因是杀掉进程后,Dockerfile指定的CMD[/run.sh]脚本运行结束,CMD入口已经退出,导致容器退出。
问题还没结束
- Kubernetes是一个基于docker的容器集群管理系统,它的一大特点是拥有Replication Controllers,他的作用主要是保持所起动的Pod数量不变(pod里面装的是container)。我猜想如果类似的kill掉容器内部的进程,那么kubernetes应该会让这个container重新启动。于是就来动手试试。  - 时速云他们应用了kubernetes,并且提供了客户端tce可以使用exec功能。运行 tce exec bbb-145fv-zkdqz ps -ef
- tce exec bbb-145fv-zkdqz kill 15
没有重启??
- 再次运行 tce exec bbb-145fv-zkdqz ps -ef
- 又出现了。  - 由此可见Kubernentes的Replication Controllers还是很强大的。保证了集群中有指定数量的pod副本在运行。

来自命令行和 python api 的 docker exec 中的管道

【中文标题】来自命令行和 python api 的 docker exec 中的管道【英文标题】:pipeline in docker exec from command line and from python api 【发布时间】:2015-07-16 08:13:02 【问题描述】:

我尝试实现的是在容器中调用mysqldump 并将数据库转储到容器自己的目录中。

起初我尝试以下命令:

$ docker exec container-name mysqldump [options] database | xz > database.sql.xz

这不起作用,所以我尝试另一个:

$ docker exec container-name bash -c 'mysqldump [options] database | xz > database.sql.xz'

这次成功了。

但这真的很蹩脚。

然后我这次尝试使用 docker-py cmd 选项,效果如下:

cmd=['bash', '-c', 'mysqldump [options]  database | xz > database.sql.xz']

记录器事件如下:

level="info" msg="-job log(exec_start: bash -c mysqldump [options]  database | xz > database.sql.xz, fe58e681fec194cde23b9b31e698446b2f9d946fe0c0f2e39c66d6fe68185442, mysql:latest) = OK (0)"

我的问题:

有没有更优雅的方式来归档我的目标?

【问题讨论】:

您的问题是什么?你想达到什么目的?请用问题的形式改写这篇文章的标题。 【参考方案1】:

你快到了,你只需要添加 -i 标志来使管道工作:

-i, --interactive    Keep STDIN open even if not attached

docker exec -i container-name mysqldump [options] database > database.sql.xz

我用文件重定向替换了管道,但它与管道相同。请确保不要使用 -t 选项,因为这会破坏它。


额外:

将 sql 转储导入 mysql:

docker exec -i container-name mysql [options] database < database.sql.xz

这个小脚本将检测我是否在管道中运行 mysql:

#!/bin/bash
if [ -t 0 ]; then
    docker exec -it container-name mysql "$@"
else
    docker exec -i container-name mysql "$@"
fi

【讨论】:

更深入地解释为什么 -t 会破坏它会很好:) 对于那些希望像上面那样导入数据库文件但使用 docker-compose 的人,以下可能会有所帮助:docker-compose exec -T SERVICE mysql database &lt; database.sql.xz 使用 -T 将禁用伪 tty 分配,从而允许您保留标准输入打开没有 tty。 我不明白这是如何在容器内创建文件的。使用&lt; 阅读我总是得到bash: /app/db/database.sql: No such file or directory。相反,它似乎是在您本地的系统上创建文件。

以上是关于exec...的docker中的EXEC的主要内容,如果未能解决你的问题,请参考以下文章

来自命令行和 python api 的 docker exec 中的管道

19-Docker-常用命令详解-docker exec

docker-compose exec python 输入设备不是 AWS EC2 UserData 中的 TTY

Docker 问题集锦(24) - 解决:OCI runtime exec failed: exec failed: container_linux.go:367

docker 命令详解:exec

Docker(17)- docker exec 命令详解