码头调试
描述 | 将 shell 放入任何容器或镜像中。使用“docker exec”进行调试的替代方法。 |
---|---|
用法 | debug [OPTIONS] {CONTAINER|IMAGE} |
测试版功能
Docker Debug 目前处于 Beta阶段。
描述
笔记
Docker 调试需要 Pro、Team 或 Business 订阅。您必须 登录才能使用此命令。
Docker Debug 是一个 CLI 命令,可帮助您遵循最佳实践,保持映像小而安全。使用 Docker 调试,您可以调试图像,同时它们包含运行应用程序的最低限度。它通过让您创建和使用通常难以调试的小型映像或容器来实现这一点,因为所有工具都已被删除。例如,虽然像这样的典型调试方法docker exec -it my-app bash
可能不适用于小型容器,但是docker debug
却可以。
使用docker debug
您可以将调试 shell 放入任何容器或映像中,即使它们不包含 shell。您无需修改映像即可使用 Docker 调试。但是,使用 Docker Debug 仍然不会修改您的映像。 Docker Debug 自带了自己的工具箱,您可以轻松自定义。该工具箱预装了许多标准 Linux 工具,例如vim
、nano
、htop
和curl
。使用内置install
命令添加
https://search.nixos.org/packages上可用的其他工具。 Docker 调试支持bash
、fish
和zsh
。默认情况下,它会尝试自动检测您的 shell。
自定义内置工具:
install [tool1] [tool2]
:从 https://search.nixos.org/packages添加 Nix 软件包,请参阅 示例。uninstall [tool1] [tool2]
:卸载 Nix 软件包。entrypoint
:打印、lint 或运行入口点,请参阅 示例。builtins
:显示自定义内置工具。
笔记
对于图像和停止的容器,离开 shell 时所有更改都将被丢弃。在任何情况下,更改都不会影响实际的映像或容器。当访问正在运行或暂停的容器时,所有文件系统更改对容器都是直接可见的。该
/nix
目录对于实际图像或容器永远不可见。
选项
选项 | 默认 | 描述 |
---|---|---|
--shell | auto | 选择一个外壳。支持的:bash ,fish ,zsh ,auto 。 |
-c, --command | 评估指定的命令而不是启动交互式会话,请参阅 示例。 | |
--host | 要连接的守护进程 docker 套接字。例如:ssh://root@example.org 、unix:///some/path/docker.sock 、 参见
示例。 |
例子
调试没有 shell 的容器(瘦容器)
该hello-world
图像非常简单,仅包含/hello
二进制文件。这是苗条形象的一个很好的例子。没有其他工具,也没有 shell。
从镜像运行容器hello-world
:
$ docker run --name my-app hello-world
容器立即退出。要在内部获取调试 shell,请运行:
$ docker debug my-app
调试 shell 允许您检查文件系统:
docker > ls
dev etc hello nix proc sys
该文件/hello
是运行容器时执行的二进制文件。您可以通过直接运行来确认这一点:
docker > /hello
运行二进制文件后,它会产生相同的输出。
调试(精简)图像
您可以通过运行直接调试图像:
$ docker debug hello-world
...
docker > ls
dev etc hello nix proc sys
您甚至不需要拉取图像,因为docker debug
它会像命令一样自动执行此docker run
操作。
修改正在运行的容器的文件
Docker 调试允许您修改任何正在运行的容器中的文件。该工具箱是附带vim
并nano
预安装的。
运行 nginx 容器并更改默认值index.html
:
$ docker run -d --name web-app -p 8080:80 nginx
d3d6074d0ea901c96cac8e49e6dad21359616bef3dc0623b3c2dfa536c31dfdb
要确认 nginx 正在运行,请打开浏览器并导航到 http://localhost:8080。您应该会看到默认的 nginx 页面。现在,使用 vim 更改它:
vim /usr/share/nginx/html/index.html
将标题更改为“欢迎使用我的应用程序!”并保存文件。现在,在浏览器中重新加载页面,您应该会看到更新后的页面。
使用安装命令管理您的工具箱
内置命令允许您将https://search.nixos.org/packagesinstall
中的任何工具添加
到工具箱中。请记住,添加工具永远不会修改实际的图像或容器。工具仅添加到您的工具箱中。运行然后安装:docker debug
nmap
$ docker debug nginx
...
docker > install nmap
Tip: You can install any package available at: https://search.nixos.org/packages.
installing 'nmap-7.93'
these 2 paths will be fetched (5.58 MiB download, 26.27 MiB unpacked):
/nix/store/brqjf4i23fagizaq2gn4d6z0f406d0kg-lua-5.3.6
/nix/store/xqd17rhgmn6pg85a3g18yqxpcya6d06r-nmap-7.93
copying path '/nix/store/brqjf4i23fagizaq2gn4d6z0f406d0kg-lua-5.3.6' from 'https://cache.nixos.org'...
copying path '/nix/store/xqd17rhgmn6pg85a3g18yqxpcya6d06r-nmap-7.93' from 'https://cache.nixos.org'...
building '/nix/store/k8xw5wwarh8dc1dvh5zx8rlwamxfsk3d-user-environment.drv'...
docker > nmap --version
Nmap version 7.93 ( https://nmap.org )
Platform: x86_64-unknown-linux-gnu
Compiled with: liblua-5.3.6 openssl-3.0.11 libssh2-1.11.0 nmap-libz-1.2.12 libpcre-8.45 libpcap-1.10.4 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select
您可以nmap
通过将调试 shell 放入不同的映像来确认它现在是您工具箱的一部分:
$ docker debug hello-world
...
docker > nmap --version
Nmap version 7.93 ( https://nmap.org )
Platform: x86_64-unknown-linux-gnu
Compiled with: liblua-5.3.6 openssl-3.0.11 libssh2-1.11.0 nmap-libz-1.2.12 libpcre-8.45 libpcap-1.10.4 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: epoll poll select
docker > exit
nmap
仍然在那里。
了解容器的默认启动命令(入口点)
Docker Debug 附带一个内置工具entrypoint
.输入hello-world
图像并确认入口点是/hello
:
$ docker debug hello-world
...
docker > entrypoint --print
/hello
该entrypoint
命令评估底层图像的ENTRYPOINT
andCMD
语句,并允许您打印、lint 或运行生成的入口点。但是,要理解了解 CMD 和 ENTRYPOINT 如何交互 中的所有极端情况可能很困难
。在这些情况下,entrypoint
可以提供帮助。
用于entrypoint
调查当您从 Nginx 映像运行容器时实际发生的情况:
$ docker debug nginx
...
docker > entrypoint
Understand how ENTRYPOINT/CMD work and if they are set correctly.
From CMD in Dockerfile:
['nginx', '-g', 'daemon off;']
From ENTRYPOINT in Dockerfile:
['/docker-entrypoint.sh']
By default, any container from this image will be started with following command:
/docker-entrypoint.sh nginx -g daemon off;
path: /docker-entrypoint.sh
args: nginx -g daemon off;
cwd:
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Lint results:
PASS: '/docker-entrypoint.sh' found
PASS: no mixing of shell and exec form
PASS: no double use of shell form
Docs:
- https://docker.github.net.cn/reference/dockerfile/#cmd
- https://docker.github.net.cn/reference/dockerfile/#entrypoint
- https://docker.github.net.cn/reference/dockerfile/#understand-how-cmd-and-entrypoint-interact
输出告诉您,在 nginx 映像启动时,/docker-entrypoint.sh
将使用参数执行脚本nginx -g daemon off;
。您可以使用以下--run
选项测试入口点:
$ docker debug nginx
...
docker > entrypoint --run
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/01/19 17:34:39 [notice] 50#50: using the "epoll" event method
2024/01/19 17:34:39 [notice] 50#50: nginx/1.25.3
2024/01/19 17:34:39 [notice] 50#50: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/01/19 17:34:39 [notice] 50#50: OS: Linux 5.15.133.1-microsoft-standard-WSL2
2024/01/19 17:34:39 [notice] 50#50: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/01/19 17:34:39 [notice] 50#50: start worker processes
2024/01/19 17:34:39 [notice] 50#50: start worker process 77
...
这会在调试 shell 中启动 nginx,而无需实际运行容器。您可以通过按Ctrl
+关闭 nginx C
。
直接运行命令(例如,用于脚本编写)
使用该--command
选项直接评估命令,而不是启动交互式会话。例如,这类似于bash -c "arg1 arg2 ..."
.以下示例cat
在 nginx 映像中运行命令,而不启动交互式会话。
$ docker debug --command "cat /usr/share/nginx/html/index.html" nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
使用 --host 选项进行远程调试
以下示例展示了如何使用该--host
选项。第一个示例使用 SSH 以用户example.org
身份连接到远程 Docker 实例root
,并在容器中获取 shell my-container
。
$ docker debug --host ssh://root@example.org my-container
以下示例连接到不同的本地 Docker 引擎,并将 shell 获取到my-container
容器中。
$ docker debug --host=unix:///some/path/docker.sock my-container