我们有一组微服务,作为坞映像发布,并在本地测试和AKS k8s集群中运行它们。我们使用ubuntu16.04,因为目前AKS使用它。
当我们的微型服务在码头容器内崩溃时,我们想要自动收集核心文件。我们已经在本地环境中使用使用说明成功地实现了它,但是我们希望使用ubuntu apport拦截器来收集CoreDump。
但是,由于以下错误,我们无法收集转储:
错误: apport (pid 26994)清华4月9日16:17:34 2020:主机pid 26979在没有apport支持的容器中崩溃。
docker run -d --privileged -v /var/crash:/var/crash ubuntu:16.04 /bin/sleep 50000
docker kill
在看看apport在做什么之后,我们似乎必须在容器中安装apport。没有问题,创建一个带有apport安装的Dockerfile:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y --no-install-recommends systemd apport && rm -rf /var/lib/apt/lists/*
RUN sed -i "s/enabled=0/enabled=1/g" /etc/default/apport
RUN sed -i "s/'problem_types'/#'problem_types'/g" /etc/apport/crashdb.conf
COPY ./super.sh /opt/super.sh
RUN ["chmod", "+x", "/opt/super.sh"]
WORKDIR /opt
ENTRYPOINT [ "/opt/super.sh" ]
其中super.sh是:
#!/bin/bash
service apport start
sleep 50000
但这也导致了同样的结果。主机apport.socket
目录下必须有一个/proc//root/run/
条目,它可能告诉apport它的另一个实例已在容器中启动并运行。apport.socket
是激活套接字,需要systemd在容器中运行。
问题
apport
托管计算机?apport
正确地传递核集合?P.S.
当注释掉/usr/share/apport/apport中的一些代码块时,我们已经实现了我们想要的行为。
869366238 data/apport (Brian Murray 2017-11-20 08:46:52 -0800)
但这不是我们愿意接受的解决办法。
发布于 2020-04-15 11:24:11
对于那些真正感兴趣的人,这是我们的发现。
为了监听apport.socket
,您必须先安装systemd。为了使systemd正常工作,它必须是容器中的第一个进程,因此必须将ENTRYPOINT
命令更改为/sbin/init
。为了使apport在容器中正常工作,您必须安装python3-systemd
模块,该模块启用了systemd激活和参数传递。为了运行您的进程,您必须编写简单的单元文件,描述如何使用systemd启动应用程序。对于ubuntu18.04,还必须安装init
包才能运行/sbin/init
。
如果您使用其他类型的虚拟化,如我的示例中的vmware (它运行主机ubuntu,其中正在运行停靠容器),您还必须从apport-forward.socket
文件中删除D7
,因为否则systemd将不会侦听前面提到的激活套接字。
综合起来,您可以在这里做些什么,以便使容器内的apport能够正常工作。
Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
COPY dotnet.service /lib/systemd/system/
RUN apt-get update && apt-get install -y --no-install-recommends \
systemd \
init \
apport \
python3-systemd && rm -rf /var/lib/apt/lists/*
RUN sed -i "s/enabled=0/enabled=1/g" /etc/default/apport && \
sed -i "s/'problem_types'/#'problem_types'/g" /etc/apport/crashdb.conf && \
sed -i "s/ConditionVirtualization=container//g" /lib/systemd/system/apport-forward.socket
RUN systemctl enable apport-forward.socket && \
systemctl enable dotnet.service
# our app
COPY . /opt/app
WORKDIR /opt/app
EXPOSE 5000
ENTRYPOINT [ "/sbin/init" ]
dotnet.service
[Unit]
Description=My service
[Service]
Type=oneshot
ExecStart=/opt/app/MyServiceElf
[Install]
WantedBy=multi-user.target
所有这些都增加了额外的~65 so的数据,这看起来很疯狂,所以我们将此问题转发给apport存储库.
https://askubuntu.com/questions/1225821
复制相似问题