首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用apport从进程中获取核心文件?

如何使用apport从进程中获取核心文件?
EN

Ask Ubuntu用户
提问于 2020-04-10 08:10:24
回答 1查看 4K关注 0票数 3

我们有一组微服务,作为坞映像发布,并在本地测试和AKS k8s集群中运行它们。我们使用ubuntu16.04,因为目前AKS使用它。

当我们的微型服务在码头容器内崩溃时,我们想要自动收集核心文件。我们已经在本地环境中使用使用说明成功地实现了它,但是我们希望使用ubuntu apport拦截器来收集CoreDump。

但是,由于以下错误,我们无法收集转储:

错误: apport (pid 26994)清华4月9日16:17:34 2020:主机pid 26979在没有apport支持的容器中崩溃。

代码语言:javascript
运行
复制
docker run -d --privileged -v /var/crash:/var/crash ubuntu:16.04 /bin/sleep 50000
docker kill 

看看apport在做什么之后,我们似乎必须在容器中安装apport。没有问题,创建一个带有apport安装的Dockerfile:

代码语言:javascript
运行
复制
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是:

代码语言:javascript
运行
复制
#!/bin/bash
service apport start
sleep 50000

但这也导致了同样的结果。主机apport.socket目录下必须有一个/proc//root/run/条目,它可能告诉apport它的另一个实例已在容器中启动并运行。apport.socket是激活套接字,需要systemd在容器中运行。

这不太好

问题

  1. 是否有一种方法可以为容器内的应用程序启用核心转储转发,以便使用apport托管计算机?
  2. 在容器中应该做些什么才能使apport正确地传递核集合?
  3. 我们真的需要在坞内安装系统d才能工作吗?

P.S.

当注释掉/usr/share/apport/apport中的一些代码块时,我们已经实现了我们想要的行为。

代码语言:javascript
运行
复制
869366238 data/apport (Brian Murray 2017-11-20 08:46:52 -0800)

但这不是我们愿意接受的解决办法。

EN

回答 1

Ask Ubuntu用户

发布于 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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
[Unit]
Description=My service

[Service]
Type=oneshot
ExecStart=/opt/app/MyServiceElf

[Install]
WantedBy=multi-user.target

所有这些都增加了额外的~65 so的数据,这看起来很疯狂,所以我们将此问题转发给apport存储库.

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1225821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档