我试图从一台机器上获取一个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.
在该示例中,我们首先拉取一个映像 (ubuntu) 并u1
从中成功创建/运行容器。然后我们将该容器导出到文件 ( exported
),停止/删除该容器,将文件导入新映像 ( ubuntu:imported
) 并尝试从中运行新容器。失败。
答案1
docker export
不会导出有关容器的所有内容 — 仅导出文件系统。因此,在将转储导入新的 docker 镜像时,需要指定其他标志来重新创建上下文。
例如,如果原始容器运行良好,因为用于创建其映像的 Dockerfile 包含CMD ["/usr/bin/supervisord"]
在其中,则可以通过以下方式导入转储:
docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
答案2
您可以使用docker load
命令从存档文件中加载图像。此命令将一起导入图像文件和参数。
答案3
当你导出容器时,它会丢失包含镜像层和元数据的历史记录。因此,你的容器会丢失其 pid 状态。
每个容器都应该有一个初始(根)进程。您正在将 dockerfile 上的默认入口点覆盖为 bash。[编辑] 我认为即使您不覆盖它也会使用默认值,而默认值未在 ubuntu 基础映像中定义。因此,您应该使用 cmd 命令启动初始进程。我认为没有错误。这是 dockerfile 的可重用性功能。
答案4
通过这些额外的步骤,它就可以正常工作:
创建Dockerfile如下:
FROM ubuntu:imported ENTRYPOINT ["/bin/bash"]
创建新图像:
docker build -t ubuntu:importedwithdockerfile .
现在它将运行:
docker run --name u1 -dit ubuntu:importedwithdockerfile
但是,仍然不清楚为什么简单地导出然后导入图像不能立即起作用。这是一个错误吗?