我的网站使用 Docker 容器,并使用 Azure 应用服务将其托管在 Azure 上。我使用 Seq 日志服务器来集中记录日志。
恐怕答案可能是:这是不可能的。将 Docker 容器日志发送到 Seq 日志服务器的“正确”方法包括向命令添加一些参数docker run,但我找不到任何方法在 Azure 应用服务或相应的Azure Web 应用服务容器任务中提供此类参数我用它来将新的容器映像部署到该服务。
我希望将 docker 日志发送到 Seq 的原因之一是我认为 Azure 对日志的处理令人困惑。 这个问题包含许多关于如何从 Azure 中获取一些 docker 日志的答案,但没有一个比在 Seq 日志服务器中搜索“docker”更简单或完整。
也许 Azure 应用服务不是完成这项工作的正确工具。相反,也许我应该使用 Azure 容器实例 (ACI)。 与 Docker 的集成似乎很强大。然而,这个答案说
Azure Web App for Containers 的目标是长时间运行的东西(始终运行),而 ACI 的目标是计划\突发\短期工作负载(类似于 Azure Functions)。
我的网站应该始终运行,因此这让我认为我正确使用了 Azure 应用服务。
也许我应该使用Docker 任务部署到我的 Azure 应用服务。然而,有两件事让我有不同的想法。首先是任务说:
我一直在使用 docker-compose 来设置一些 docker 容器。我知道可以使用查看日志docker logs <container-name>。
所有日志都会被打印到,STDOUT并且STDERR当容器运行时,容器中不会生成日志“文件”。
但是,当使用或 之docker logs类的命令删除它们各自的容器时,这些日志(从命令获取)也会被删除。docker-compose downdocker-compose rm
当容器被创建并再次启动时,会有一组新的日志。不存在上次“运行”的日志。
我很好奇是否有一种方法可以防止日志与其容器一起被删除。
理想情况下,即使容器被移除,我也希望保留以前的所有日志。
作为 docker 自动化的一部分,我尝试使用 python docker 包来自动化某些 docker 操作。好吧,我已经成功实现了大部分要求,但找不到等效的方法
docker logs <container-id>
Run Code Online (Sandbox Code Playgroud)
我的实现:
import docker
client = docker.APIClient()
client.attach(container, stdout=True, stderr=True, stream=False, logs=True, demux=False)
Run Code Online (Sandbox Code Playgroud)
然而它并没有给出预期的结果。请帮助我找出实施中缺少的内容。预先感谢您回答这个问题
#更新
import docker
z=docker.from_env()
dkg = z.containers.get('<container_id>').logs(stream = True, follow = False, tail =10)
while True:
line = next(dkg).decode("utf-8")
print(line)
Run Code Online (Sandbox Code Playgroud)
好吧,我已经通过参考链接将我的实现替换为上面的实现。尽管添加 tail 选项后它不起作用。添加 tail 命令时,它显示空白,没有任何错误。有关获得尾部结果的任何提示
我有一个简单的脚本,每 2 秒打印一次 hello。
# entry.py
import time
while True:
print("hello")
time.sleep(2)
Run Code Online (Sandbox Code Playgroud)
我有一个运行此脚本的超简单 docker 文件。
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
Run Code Online (Sandbox Code Playgroud)
首先我构建docker镜像:
FROM python:3.9
COPY entry.py entry.py
CMD python entry.py
Run Code Online (Sandbox Code Playgroud)
现在我用这个-it选项运行它,它按预期工作。
$ docker build -t dtest .
Run Code Online (Sandbox Code Playgroud)
但是当我在分离模式下运行它,然后尝试查看日志时,我什么也看不到。
$ docker run -it dtest
# hello printed to screen every two seconds
Run Code Online (Sandbox Code Playgroud)