Как получить coredump от процесса, разрушенного в контейнере докера, использующем по левую сторону судна?

У нас есть набор микросервисов, опубликованных, поскольку докер отображает и выполняет их на месте для локального тестирования и в кластере AKS k8s. Мы используем человечность 16.04, потому что в настоящее время AKS использует ее.

Мы хотели бы автоматически собрать coredump, когда наш микросервис отказывает в контейнере докера. Мы имеем, успешно достигают его с помощью инструкций относительно окружения, но мы хотели бы использовать человечность по левую сторону судна перехватчик для сбора CoreDump.

Но мы не могущий собрать дамп из-за следующей ошибки:

ОШИБКА: по левую сторону судна (pid 26994) четверг 9 апреля 16:17:34 2020: pid 26979 хоста, разрушенный в контейнере без по левую сторону судна, поддерживает

docker run -d --privileged -v /var/crash:/var/crash ubuntu:16.04 /bin/sleep 50000
docker kill <CreatedContainerId>

После взгляда на то, что по левую сторону судна делает, кажется, что мы должны установить по левую сторону судна в контейнере. Не проблема, создайте 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/<host_pid>/root/run/ каталог, который, вероятно, говорит по левую сторону судна, что другой экземпляр его в порядке в контейнере. apport.socket сокет активации, который потребует, чтобы systemd работал в контейнере.

Это не настолько хорошо

Вопросы

  1. Есть ли способ включить передачу дампа ядра для приложения в контейнере к использованию хост-машины apport?
  2. Что должно быть сделано в контейнере для включения apport правильно передать coredump набор?
  3. Мы действительно требуем, чтобы systemd был установлен в докере для этого для работы?

P.S.

Мы достигли поведения, которое мы хотели, когда комментируют некоторые блоки кода в/usr/share/apport/apport, представленном

869366238 data/apport (Brian Murray 2017-11-20 08:46:52 -0800)

но это не решение, которое мы хотели бы принять.

1
задан 10 April 2020 в 11:16

1 ответ

Для тех, кто действительно заинтересовал, вот наши результаты.

Для apport.socket чтобы послушаться, необходимо установить systemd сначала. Для работ systemd правильно, это должен быть первый процесс в контейнере, таким образом, необходимо изменить Ваш ENTRYPOINT команда, чтобы быть /sbin/init. Для по левую сторону судна для работы правильно в контейнере необходимо установить python3-systemd модуль, который включает systemd активацию и параметры propogation. Для выполнения процесса необходимо записать простой файл единицы, который описывает, как запустить приложение с systemd. Для человечности 18.04 также необходимо установить init пакет для разрешения /sbin/init быть выполненным.

При использовании некоторого другого вида другой виртуализации, как VMware в моем случае (который выполняет человечность хоста, на которой контейнеры докера работают), также необходимо удалить ConditionVirtualization=container от apport-forward.socket файл, потому что иначе systemd не послушает сокет активации, упомянутый ранее.

Объединение в целом, здесь что можно сделать, чтобы позволить по левую сторону судна внутреннему контейнеру работать правильно.

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

все это добавляет дополнительный ~65MB данных, которые являются сумасшедшими взглядами, таким образом, мы передаем этот вопрос по левую сторону судна репозиторию

0
ответ дан 25 April 2020 в 10:52

Другие вопросы по тегам:

Похожие вопросы: