只有一些本地构建的Docker镜像无法在远程服务器上运行(错误:"未指定命令")

时间:2017-06-15 14:15:35

标签: linux docker

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

我有一个基于Alpine的例子:

FROM alpine:3.5

# Do a system update
RUN apk update

ENTRYPOINT ["sleep", "3"]

我这样构建,然后发送到遥控器:

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 run --help'。

但是,如果我将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时,我不记得我在构建东西时使用的内核版本,但如果它是3.x则不会让我感到惊讶。

令我意想不到的另一件事是Docker版本号的高度变化。我如何在本地使用1.x版本,在远程使用17.x版本?该项目是否已通过版本重新编号?

更新

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

4.4.0-75-generic

所以,这让我觉得主要的内核差异不应该受到责备。

2 个答案:

答案 0 :(得分:2)

我发现了这个非常古老的问题:https://github.com/moby/moby/issues/1826

  

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

因此,使用入口点运行它:

docker run --entrypoint sleep alpine-sleep 3

答案 1 :(得分:2)

问题是当您使用保存/加载和导出/导入的错误组合时,Docker不会警告您。您保存/加载图像,并从容器导出/导入tar文件。由于您正在执行docker save来保存图像,因此您需要执行docker load将其还原到其他主机上:

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