重新导入的 docker 镜像/容器中的“未指定命令”

Gre*_*ake 30 docker

我试图从一台机器上获取一个 docker 容器并在另一台机器上运行它并遇到此错误:“来自守护进程的错误响应:未指定命令”。

下面是一个显示问题的简化示例:

docker --version
Docker version 1.10.1, build 9e83765
docker pull ubuntu
docker run --name u1 -dit ubuntu:latest
docker export -o exported u1
docker stop u1
docker rm u1
docker import exported ubuntu:imported
docker run --name u1 -dit ubuntu:imported
docker: Error response from daemon: No command specified.
Run Code Online (Sandbox Code Playgroud)

在那个例子中,我们首先拉取一个镜像 (ubuntu) 并u1从它成功创建/运行容器。然后我们将该容器导出到文件 ( exported),停止/删除容器,将文件导入新映像 ( ubuntu:imported) 并尝试从中运行新容器。它失败。

Gre*_*ake 27

docker export不会导出容器的所有内容——只是文件系统。因此,当将转储导入新的 docker 镜像时,需要指定额外的标志来重新创建上下文。

例如,如果原始容器运行良好,因为用于创建其映像的 Dockerfile 包含在其中,则以CMD ["/usr/bin/supervisord"]这种方式导入转储:

docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
Run Code Online (Sandbox Code Playgroud)

  • 你可以运行 `docker inspect imagename:tagname` 比较原始的和导入的。我对 `import`/`export` 和 `--change` 不走运,尽管使用 `save`/`load` 一切正常。 (5认同)

小智 14

您可以使用docker load命令从存档文件加载图像。此命令将一起导入图像文件和 args。

  • @Greendrake `docker load` 和 `docker save` 操作容器镜像(容器从中创建),而 `docker import` 和 `docker export` 操作容器。 (6认同)
  • 在这种情况下,什么是“存档”文件以及如何创建它? (2认同)