docker Attach 和 docker exec 之间的区别

2024-04-03

两者都能够在容器中执行命令。 两者都可以分离容器。

那么 docker exec 和 docker Attach 之间的真正区别是什么?


2015年:有一个提交公关 https://github.com/docker/docker/commit/2f46ec60c012e94771698351515178fe9caea21a添加到文档中:

Note:该命令(attach) 不适用于在容器中运行新进程。 看:docker exec.

答案“码头工人。如何在运行的容器中获取 bash\ssh (run -d)? https://askubuntu.com/a/507009/5470” 说明了差异:

(docker >= 1.3) 如果我们使用docker attach https://docs.docker.com/engine/reference/commandline/attach/, 我们只能使用一个 shell 实例.
因此,如果我们想使用容器外壳的新实例打开新终端,我们只需要运行docker exec https://docs.docker.com/engine/reference/commandline/exec/

如果 docker 容器是使用以下命令启动的/bin/bash命令,您可以使用 Attach 访问它,如果没有则需要execute在容器内创建 bash 实例的命令使用exec.

正如中提到的这个问题 https://github.com/docker/docker/issues/2855#issuecomment-57102647:

  • Attach 不是为了在容器中运行额外的东西,而是为了附加到正在运行的进程。
  • "docker exec" 专门用于在已经启动的容器中运行新事物,无论是 shell 还是其他进程。

同样的问题补充道:

While attach命名不好,特别是因为 LXC 命令lxc-attach(这更类似于docker exec <container> /bin/sh,但 LXC 特定),它确实有一个特定的目的,即从字面上将您附加到 Docker 启动的进程。
根据进程的不同,行为可能会有所不同,例如附加到/bin/bash会给你一个 shell,但是附加到 redis-server 就像你刚刚直接启动 redis 而没有守护进程一样。


2022 年更新:通过“查看更多内容”容器 101:attach 与 exec - 有什么区别? https://iximiuz.com/en/posts/containers-101-attach-vs-exec/”(2021 年 12 月)来自伊万·韦利奇科 https://twitter.com/iximiuz:

Extract:

附加和日志之间的区别

在上图中,docker attach将容器的日志流回终端。
但是,那docker logs命令做了类似的事情。
那么,有什么区别呢?

Logs 命令提供了各种选项来过滤日志,而 Attach 在这方面充当简单的尾部。
但更重要的是,logs 命令建立的流始终是单向的,并且连接到容器的日志,而不是直接连接到容器的 stdio 流。

logs 命令只是将容器日志的内容流式传输回您的终端,仅此而已。
因此,无论您如何创建容器(交互式或非交互式,是否由伪终端控制),您在使用日志命令时都不会意外影响容器。

但是,当使用 Attach 时:

  • 如果容器是在交互模式下创建的(-i),附加到容器后在终端中输入的所有内容都将发送到其标准输入。
  • 你可以(有意或无意)向容器发送信号 -例如,在附加发送时按 ctrl+cSIGINT到容器 https://stackoverflow.com/a/49226544/6309.

exec命令有什么作用

exec 命令实际上是一个完全不同的故事。

在附加的情况下,我们将终端连接到现有容器(读取、处理)。

However, the exec command starts a totally new container!
In other words, exec is a form of the run command (which itself is just a shortcut for create + start).

Bart https://stackoverflow.com/users/1023850/bart提醒我们在评论 https://stackoverflow.com/questions/30960686/difference-between-docker-attach-and-docker-exec/30962120#comment126703209_30962120 that docker exec https://docs.docker.com/engine/reference/commandline/exec/在 a 中运行一个新命令running容器。不是“全新的”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker Attach 和 docker exec 之间的区别 的相关文章

随机推荐