当前位置: 首页 > 工具软件 > dockerize > 使用案例 >

Dockerize控制依赖顺序应用

计承德
2023-12-01

Dockerizing 一个应用是转化一个应用运行在 Docker 容器中的过程。虽然 dockering 大部分应用是简单的,但是这里每次都有一些问题围绕着工作。每次工作的时候有几个问题都需要待解决。

在 dockerization 时两个常见的问题是:

当它依赖于配置文件时,使得应用使用环境变量
发送应用日志到 STDOUT/STDERR,当它默认记录在 Docker 的文件系统

这篇文章介绍一个新工具:dockerize ,它简化了这两个常见的问题。

问题

配置
许多应用使用配置文件来控制它们怎么工作,不同的运行环境有不同的值。比如,对于一个开发环境的数据库连接细节将与生产环境的不同。类似的,API keys 和其他的敏感细节在不同环境将不同。

使用 docker 容器有几个方法可以处理这些环境变量的问题:

在镜像中嵌入所有的环境变量细节和使用一个控制环境变量变量来指出在运行时使用哪个文件。(比如:APP_CONFIG=/etc/dev.config)
在运行时,使用卷来挂载绑定配置文件的数据
使用封装脚本,使用工具像 sed 那些环境变量来修改配置数据
嵌入所有的环境变量细节是不理想的,因为环境变量的改变应该不需要重新构建一个镜像。它也缺少安全,因为敏感数据 API keys, login 证书等等,作为环境变量被存储在镜像中。私发一个开发环境可能会泄露生产环境细节。有些类型的细节在任何镜像中都应该避免的。
使用 volumes 保持这些细节在镜像外面,但会使得部署更复杂,因为你不仅部署镜像。你必须使配置文件的变更和镜像协调。

注入环境变量到普通文件中也不是重要的。你可能有时会制作一个 sed 命令或写一些普通的脚本给它,但这是重复性的工作。这确实产生了一个镜像,但在 Docker 生态系统中工作的很好。

Logging
Docker 容器日志记录到 STDOUT 和 STDERR 更容易故障排解,监控和融入一个中央日志系统。日志可以通过 docker logs 命令和 Docker 日志 API 调用来直接访问。这也有许多工具可以自动拉取 docker 日志和运送它们如果日志记录进 STDOUT 和 STDERR。

不幸地是,默认,许多应用日志记录一个或多个文件到文件系统上。虽然这通常可以围绕工作,计算出每个应用的日志配置的细微差别是乏味的。

使用 Dockerize

dockerize 是一个小型的 Golang 应用,可以通过以下简化 dockerization 过程:

1.在启动时使用模板生成配置文件和容器环境变量
2.tail 任意的日志文件到 STDOUT 和 STDERR
3.启动一个进程,运行在容器里面

一个示例
在解决服务依赖问题上使用dockerize:
在docker-compose.yaml各个服务的command中的配置如下:

command: ["dockerize", "-wait", "tcp://zookeeper:2181", "-wait", "tcp://mysql:3306", "-wait", "http://apphost:8080", "-timeout", "1800s", "/usr/bin/supervisord"]

选项说明:

-wait <protocol://host:port> 

-wait 参数可以添加多个,代表依赖多个服务

-timeout 1800s

-timeout 后面跟持续等待的秒数,默认是10秒

最后一个命令是各依赖服务准备好之后要执行的命令,也就是当前应用启动的命令

支持的协议有:file, tcp, tcp4, tcp6, http, https and unix

 类似资料: