只有一些本地构build的Docker镜像无法在远程服务器上工作(错误:“No command specified”)

我有一个困惑的Docker问题。 我在我的Mint笔记本电脑和Ubuntu VPS上运行Docker。 我已经能够在本地生成图像,并将它们发送到服务器,并让它们在那里运行。 但是,为了清楚起见,那些工作的人可能是在我本地运行Ubuntu时创build的(稍后会介绍)。

我有一个基于阿尔派的例子:

FROM alpine:3.5 # Do a system update RUN apk update ENTRYPOINT ["sleep", "3"] 

我像这样build立,并发送到遥控器:

 docker build -t alpine-sleep . docker save alpine-sleep | gzip > alpine-sleep.tgz rsync --progress alpine-sleep.tgz myserver.example.com:/path/to/images/ 

然后,我在远程解压/导入,并运行,从而:

 docker import /path/to/images/alpine-sleep.tgz alpine-sleep docker run -it alpine-sleep 

我得到这个控制台的答复:

docker:来自守护进程的错误响应:没有指定命令。
参见“docker运行 – 帮助”。

但是,如果我将Dockerfile复制到远程,请执行以下操作:

 docker build -t alpine-sleep-localbuild . docker run -it alpine-sleep-localbuild 

那么我的sleep正常。

我的Docker和内核版本在本地:

 jon@jvb ~/alpine_test $ uname -r 4.4.0-79-generic jon@jvb ~/alpine_test $ docker -v Docker version 1.12.6, build 78d1802 

远程:

 root@vps:~/alpine-sleep# uname -r 3.13.0-24-generic root@vps:~/alpine-sleep# docker -v Docker version 17.05.0-ce, build 89658be 

我想知道,内核的主要区别是否有所作为? 我预计3.13到4.4是一个相当大的跳跃。 我不记得当我在本地运行Ubuntu时创build什么版本的内核,但是如果它是3.x则不会令我感到意外。

另一件让我感到意外的事情是Docker版本号的高度变化。 如何在本地版本1.x和远程版本17.x? 该项目是否通过版本重新编号?

更新

我刚刚在本地运行Ubuntu时检查了内核版本,那是:

 4.4.0-75-generic 

所以呢,这让我觉得主要的内核差异是不能责怪的。

问题在于,当您使用错误的保存/加载和导出/导入组合时,Docker不会警告您。 您保存/加载图像,并从容器中导出/导入tar文件。 由于您正在执行一个docker save以保存您的映像,因此您需要执行docker load以在另一个主机上进行恢复:

 docker load < /path/to/images/alpine-sleep.tgz 

我发现这个很老的问题: https : //github.com/moby/moby/issues/1826

通过docker导入导入的图像将不知道要运行的命令。 任何图像将在导出时丢失所有关联的元数据,因此在将其导入其他位置后,默认命令将不可用。

所以,运行它的入口点:

 docker run --entrypoint sleep alpine-sleep 3