为什么导入后运行Docker镜像时无法启动应用程序

时间:2019-03-26 04:58:53

标签: docker dockerfile

下面是我的dockerfile

FROM node:10.15.0
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./build/release /usr/src/app/
RUN yarn
EXPOSE 3000
CMD [ "node", "server.js" ]

首先我跑了

docker build -t app .

然后

docker run -t -p 3000:3000 app

通过我的计算机上的localhost:3000,一切正常。

然后我尝试导出此图像

 docker export 68719e2bb0cd > app.tar

然后通过

再次导入
cat app.tar | docker import - app2

然后运行     docker run -t -d -p 2000:3000 app2

错误出现了

docker: Error response from daemon: No command specified.

为什么会这样?

2 个答案:

答案 0 :(得分:1)

您使用了错误的命令:docker exportdocker import仅传输映像的文件系统部分,而不传输环境变量或默认命令之类的其他数据。这些命令实际上并没有很好的典型用例。

执行此操作的标准方法是set up a Docker registry或使用公共注册服务器,如Docker Hub,AWS ECR,GCR等。...完成此设置后,可以docker push镜像到从它所基于的系统中注册,然后docker pull在您要在其上运行它的系统上(或直接docker run在它上运行它,如果不存在,它将自动拉出映像)。

如果您确实无法设置注册表,那么您真正想要的命令是docker savedocker load,它们会保存完整的图像及其所有元数据。在无法将要运行映像的系统连接到注册表服务器的环境中,每个人都只需要这些。否则,注册表几乎总是更好。 (集群环境(如Docker Swarm和Kubernetes都需要注册)。

答案 1 :(得分:0)

只需传递命令即可运行。因为导入的图像将在导出时丢失其所有关联的元数据,所以在将其导入其他位置后,默认命令将不可用。

正确的命令应类似于:  docker run -t -d -p 2000:3000 app2 /path/to/something.sh