Docker - 无法检查点容器

Ani*_*rua 6 containers checkpoint docker

我正在尝试在 busybox 图像中使用检查点。起初我创建了一个常规循环,然后打印数字。

docker run -d --name simple13 busybox /bin/sh -c "i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done"

docker logs -f simple13
Run Code Online (Sandbox Code Playgroud)

然后我尝试通过以下命令使用检查点 -

docker checkpoint create simple13 checkpoint1
Run Code Online (Sandbox Code Playgroud)

但是,它显示了一些这样的错误 -

    Error response from daemon: Cannot checkpoint container simple13: 
docker-runc did not terminate sucessfully: CRIU version check failed: exec: 
"criu": executable file not found in $PATH path= 
/var/run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/2fd6f5b517
3fb75ee2793d50602506ee6bc97fcd49df93141846fec21f003be4/criu-dump.log: unknown
Run Code Online (Sandbox Code Playgroud)

这里已经开启了实验。那么,你能告诉我我需要在这里做什么才能正确使用检查点吗?谢谢。

? docker version
Client:
 Version:       17.12.0-ce
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    c97c6d6
 Built: Wed Dec 27 20:05:22 2017
 OS/Arch:       windows/amd64

Server:
 Engine:
  Version:      17.12.0-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.2
  Git commit:   c97c6d6
  Built:        Wed Dec 27 20:12:29 2017
  OS/Arch:      linux/amd64
  Experimental: true
Run Code Online (Sandbox Code Playgroud)

tgo*_*gos 2

您在bash 变量扩展方面遇到了一些问题。你通过的方式CMD将继续打印空行,而不是数字。查看命令最终如何设置到容器(结果是docker container inspect ...输出的一部分:

\n\n
"Cmd": [\n    "/bin/sh",\n    "-c",\n    "i=0; while true; do echo ; i=1; sleep 1; done"\n], \n
Run Code Online (Sandbox Code Playgroud)\n\n

我对引号的使用做了一些更改,并打印了以下数字:

\n\n
docker run -d --name simple13 busybox /bin/sh -c \'i=0; while true; do echo "$i"; i=$(expr "$i" + 1); sleep 1; done\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

Cmd请注意现在结果的差异docker container inspect simple13

\n\n
"Cmd": [\n    "/bin/sh",\n    "-c",\n    "i=0; while true; do echo \\"$i\\"; i=$(expr \\"$i\\" + 1); sleep 1; done"\n],\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于docker checkpoint create simple13 checkpoint1错误:

\n\n

对我来说,使用后就解决了:

\n\n
sudo apt-get install criu\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我认为,它仍然没有发挥应有的作用。例子:

\n\n
ubuntu@ubuntu:~$ docker run -d --name simple13 busybox /bin/sh -c \'i=0; while true; do echo "$i"; i=$(expr "$i" + 1); sleep 1; done\'\n1ffd1f30aec96e07ac7c229c581b7ccd5feb9d180602eeb663211189abc652e4\nubuntu@ubuntu:~$ docker logs simple13 \n0\n1\n2\n3\nubuntu@ubuntu:~$ docker checkpoint create simple13 checkpoint1\ncheckpoint1\nubuntu@ubuntu:~$ docker container ls -a\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES\n1ffd1f30aec9        busybox             "/bin/sh -c \'i=0; wh\xe2\x80\xa6"   19 seconds ago      Up 18 seconds                           simple13\nubuntu@ubuntu:~$ docker logs simple13 \n0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\nubuntu@ubuntu:~$ docker checkpoint ls simple13\nError response from daemon: open /var/lib/docker/containers/1ffd1f30aec96e07ac7c229c581b7ccd5feb9d180602eeb663211189abc652e4/checkpoints/checkpoint1/config.json: no such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n

  • 正确的。criu 软件包必须安装在 Docker 服务器上。 (3认同)