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

重新导入的 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.

在该示例中,我们首先拉取一个映像 (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

通过这些额外的步骤,它就可以正常工作:

  1. 创建Dockerfile如下:

    FROM ubuntu:imported
    ENTRYPOINT ["/bin/bash"]
    
  2. 创建新图像:

    docker build -t ubuntu:importedwithdockerfile .
    
  3. 现在它将运行:

    docker run --name u1 -dit ubuntu:importedwithdockerfile
    

但是,仍然不清楚为什么简单地导出然后导入图像不能立即起作用。这是一个错误吗?

相关内容