docker import容器后,启动镜像
建议还是用Dockerfile更好一点,但是真的有import的容器需要启动怎么搞呢?折腾了一会,成功运行。
References:
- https://docs.docker.com/engine/reference/commandline/export/ 官方doc,export命令
- https://docs.docker.com/engine/reference/commandline/import/ 官方doc,import命令
- https://serverfault.com/questions/757210/no-command-specified-from-re-imported-docker-image-container
- https://docs.docker.com/samples/library/nginx/
- http://dockone.io/question/541 查看docker container的启动命令
首先,export和import都比较简单,照着doc,或者找些文档都能很容易的执行成功,但是启动容器时就会报错。提示:“Error response from daemon: No command specified”。
这是因为docker export
不会将容器所有的东西都保存,只会保存文件系统。所以当import一个容器的时候,需要额外添加一些信息来重建context。
例如,原本的容器正常运行,因为创建image的Dockerfile中有命令CMD["/usr/bin/supervisord"],那么就需要像这样import:
docker import \
--change 'CMD ["/usr/bin/supervisord"]' \
path/to/dump.tar imagename:tagname
如果import的时候没有通过--change
将Dockerfile指令应用到image,那么就需要在启动时将命令带上。
下面以Nginx为例,看下如何启动import命令导入的容器。
首先查看已有的image:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 395b700bb640 3 weeks ago 88.3 MB
docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB
已经pull了官方的Java和Nginx,现在我们导入一个nginx,由于--change的方式尝试了N次都失败了,所以这里贴以下带命令的方式:
先导入
[root@localhost ~]# docker import nginx_my.tar nginx:import
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx import 4f4fa7429078 22 seconds ago 86.8 MB
docker.io/nginx latest 395b700bb640 3 weeks ago 88.3 MB
docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB
然后运行:
[root@localhost ~]# docker run --name nginx_import -p 333:80 -d nginx:import nginx -g 'daemon off;'
086c5af7cb23f97e481d3224c5b7bf263b13db277221221bdc3258bacd851169
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
086c5af7cb23 nginx:import "nginx -g 'daemon ..." 7 seconds ago Up 4 seconds 0.0.0.0:333->80/tcp nginx_import
23d72cc48ab4 nginx "nginx -g 'daemon ..." 18 hours ago Up 18 hours 0.0.0.0:233->80/tcp focused_shirley
这样就启动成功了,查资料的时候看到有人说即使加了命令也会启动失败,猜测是少了什么参数吧。
建议这种方式还是不用的为好,有点坑。