假设我有一个使用这个简单的Dockerfile的应用程序:
//...
RUN configure.sh --logmyfiles /var/lib/myapp
ENTRYPOINT ["starter.sh"]
CMD ["run"]
EXPOSE 8080
VOLUME ["/var/lib/myapp"]
我从那里运行一个容器:
sudo docker run -d --name myapp -p 8080:8080 myapp:latest
因此它可以正常工作并将一些日志存储在docker容器的/var/lib/myapp
中。
我的问题
我也需要这些日志文件自动保存在主机中,那么如何将/var/lib/myapp
从容器挂载到主机服务器中的/var/lib/myapp
(不删除当前容器)?
修改
我也看到了Docker - Mount Directory From Container to Host,但它并没有解决我的问题我需要一种方法将我的文件从docker备份到主机。
答案 0 :(得分:16)
首先,提供一些关于Docker volumes的信息。卷装入仅在容器创建时发生。这意味着在启动容器后无法更改卷装入量。此外,卷装入仅是单向的:从主机到容器,反之亦然。当您在容器中指定作为卷安装的主机目录时(例如:docker run -d --name="foo" -v "/path/on/host:/path/on/container" ubuntu
),它是一个“常规”linux mount --bind
,这意味着主机目录将暂时“覆盖” “容器目录。目标目录上实际上没有删除或覆盖任何内容,但由于容器的性质,这实际上意味着它将在容器的生命周期内被覆盖。
所以,你有两个选择(可能是三个)。您可以将主机目录挂载到容器中,然后在启动脚本中复制这些文件(或者如果您bring cron into your container,则可以使用cron定期将这些文件复制到该主机目录卷挂载中。)
您还可以使用docker cp
将文件从容器移动到主机。现在这有点像hacky,绝对不是你应该在基础设施自动化中使用的东西。但确实非常适合这个目的。一次性或调试是一个很好的情况。
您也可以设置网络传输,但这非常适合您正在做的事情。但是,如果您希望定期为日志文件(或其他)执行此操作,则可以考虑使用rsyslog
之类的内容将这些文件从容器中移除。
答案 1 :(得分:2)
那么如何将/ var / lib / myapp从容器挂载到主机服务器中的/ var / lib / myapp
恰恰相反:你可以mount an host folder to your container on docker run
。
(不删除当前容器)
我不这么认为
现在,您可以查看docker inspect <containername>
,看看您是否在容器中与卷关联的/var/lib/docker/volumes/...
中看到了您的日志。
或者您可以将docker logs <containername>
的结果重定向到主机文件
有关更多示例,请参阅this gist。
另一种方法是将主机目录作为日志文件夹挂载,然后直接在主机上访问日志文件。
me@host~$ docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx dockerfile/nginx
me@host~$ ls <log-dir>
(同样,这适用于您启动的容器,而不是现有的运行容器)