我注意到 docker 我需要了解容器内发生了什么或其中存在哪些文件。一个例子是从 docker index 下载图像——你不知道图像包含什么,因此无法启动应用程序。
理想的情况是能够通过 ssh 进入它们或等效的。是否有工具可以做到这一点,或者我对 docker 的概念化认为我应该能够做到这一点是错误的。
原文由 user2668128 发布,翻译遵循 CC BY-SA 4.0 许可协议
我注意到 docker 我需要了解容器内发生了什么或其中存在哪些文件。一个例子是从 docker index 下载图像——你不知道图像包含什么,因此无法启动应用程序。
理想的情况是能够通过 ssh 进入它们或等效的。是否有工具可以做到这一点,或者我对 docker 的概念化认为我应该能够做到这一点是错误的。
原文由 user2668128 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:探索!
这个命令应该让你 探索一个正在运行的 docker 容器:
docker exec -it name-of-container bash
docker-compose 中的等效项是:
docker-compose exec web bash
(在这种情况下,web 是服务名称,默认情况下它具有 tty。)
一旦你在里面做:
ls -lsa
或任何其他 bash 命令,例如:
cd ..
这个命令应该让你 探索一个 docker 镜像:
docker run --rm -it --entrypoint=/bin/bash name-of-image
一旦进入内部做:
ls -lsa
或任何其他 bash 命令,例如:
cd ..
-it
代表交互式…和 tty。
此命令应允许您 检查正在运行的 docker 容器或映像:
docker inspect name-of-container-or-image
您可能想这样做并找出那里是否有 bash
或 sh
。在 json 返回中查找入口点或 cmd。
注意: 此答案依赖于存在的 commen 工具,但如果没有 bash
shell 或 等常用工具 ls
如果您有权访问 Dockerfile
:高山示例:
RUN apk add --no-cache bash
否则,如果您无权访问 Dockerfile
则只需将文件从新创建的容器中复制出来并通过以下方式查看它们:
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
请参阅 docker exec 文档
请参阅 docker 检查文档
请参阅 docker 创建文档
原文由 Khalil Gharbaoui 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
2 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答794 阅读✓ 已解决
这里有几种不同的方法……
A)使用 docker exec (最简单)
Docker 1.3 或更新版本支持命令
exec
其行为类似于nsenter
。此命令可以在已经运行的容器中运行新进程(容器必须已经运行 PID 1 进程)。您可以运行/bin/bash
来探索容器状态:请参阅 Docker 命令行文档
B) 使用快照
您可以通过这种方式评估容器文件系统:
这样,您可以在精确的时刻评估正在运行的容器的文件系统。容器仍在运行,不包括未来的更改。
您可以稍后使用(正在运行的容器的文件系统不受影响!)删除快照:
C) 使用 ssh
如果您需要持续访问,您可以将 sshd 安装到您的容器并运行 sshd 守护进程:
这样,您可以使用 ssh 运行您的应用程序(连接并执行您想要的)。
D) 使用 nsenter
使用
nsenter
,请参阅 为什么不需要在 Docker 容器中运行 SSHd