背景:我正在使用 docker-compose 将 tomcat 服务放入 docker swarm 集群,但我目前正在努力解决如何处理日志目录,因为我想要扩展服务但保留日志目录的唯一性。
考虑(显然)由 docker-compose 组成,它只是启动 tomcat 并安装一个日志文件系统来捕获日志。
版本:'2'
服务:
Tomcat :
图片:“tomcat:最新”
主机名:tomcat-example
命令:/start.sh
卷:
- "/data/container/tomcat/logs:/opt/tomcat/logs,z"
版本
- docker 1.11
- docker-compose 1.7.1
- API 版本 1.21
问题:我希望了解如何将变量插入到“卷”日志路径中,以便每个扩展服务实例的日志目录都是唯一的
说,
volumes:
- "/data/container/tomcat/${container_name}/logs:/opt/tomcat/logs,z"
我看到基于项目名称(或我所在的目录),容器名称实际上是已知的,所以我可以使用它吗?
例如,将项目名称设置为“tomcat”并运行 docker-compose scale tomcat=2
我会看到以下容器。
- 主机名/tomcat_1
- 主机名/tomcat_2
那么有什么方法可以利用它作为日志量中的变量,欢迎其他建议或方法。我意识到我可以只指定一个相对路径并让 container_id 处理这个问题,但是现在如果我将 splunk 或 logstash 附加到日志设备,我需要知道哪些确实是日志设备而不是基本容器 f/秒。但是理想情况下,我希望在这里使用特定的绝对路径。
提前感谢 docker ! R.
最佳答案
您真的不应该登录到文件系统,而是使用专门的日志管理工具,例如 graylog/logstash/splunk/...。在 Tomcat 中使用特定的 appender 配置日志框架,或者登录到 sysout 并在 Docker 中配置日志驱动程序以将日志重定向到外部目标。
这就是说,如果你真的想走文件系统的方式,只需使用一个常规的未命名卷,然后在你的容器上调用 docker inspect
来查找卷在文件系统上的路径:
[...snip...]
"Mounts": [
{
"Type": "volume",
"Name": "b8c...SomeHash...48d6e",
"Source": "/var/lib/docker/volumes/b8c...SomeHash...48d6e/_data",
"Destination": "/opt/tomcat/logs",
[...snip...]
如果您想在特定位置拥有好看的名称,请使用脚本创建符号链接(symbolic link)。
然而,我仍然对这个解决方案持怀疑态度,尤其是在多主机群环境中。登录到外部的专业服务是您的用例的方式。
关于docker - 使用 docker-compose 扩展服务时如何在卷路径中指定迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38504328/