Docker Alpine и perf не ладят в докере - PullRequest
0 голосов
/ 03 марта 2019

Перво-наперво:

  1. Alpine Version 3.9.0
  2. perf [от: http://dl -cdn.alpinelinux.org / alpine / edge / testing] 4.18.13
  3. Docker 18.09.3 build 774a1f4

Мой Dockerfile

FROM alpine:latest

# Set the working directory to /app
WORKDIR /app/

# Install any needed packages specified in requirements.txt
RUN yes | apk add vim
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a  /etc/apk/repositories
RUN apk add --update perf

Проблема, эти команды выполняются внутри контейнера:

/ # cat /proc/sys/kernel/perf_event_paranoid 
-1
/ # perf stat -d sleep 1
Error:
No permission to enable task-clock event.

You may not have permission to collect stats.

Consider tweaking /proc/sys/kernel/perf_event_paranoid,
which controls use of the performance events system by 
unprivileged users (without CAP_SYS_ADMIN).

The current value is -1:

   -1: Allow use of (almost) all events by all users
       Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
 >= 0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
       Disallow raw tracepoint access by users without CAP_SYS_ADMIN
 >= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
 >= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN

 To make this setting permanent, edit /etc/sysctl.conf too, e.g.:

      kernel.perf_event_paranoid = -1

 / # 

Команда для запуска образа:

docker run -it --mount type=tmpfs,tmpfs-size=512M,destination=/app/ alpy

Я давно работал с perf.Но это первое.Кто-нибудь знает, почему perf знает, что у меня есть разрешение на профилирование, но не позволяет мне делать это?

Спасибо.

1 Ответ

0 голосов
/ 03 марта 2019

Проблема состоит в том, что Docker по умолчанию блокирует список системных вызовов, включая perf_event_open, на который сильно полагается perf.

Официальная ссылка на докер: https://docs.docker.com/engine/security/seccomp/

Решение:

  • Загрузите стандартный seccomp (безопасный вычисления) файл для докера.Это файл json.
  • Найдите «perf_event_open», он появляется только один раз, и удалите его.
  • Добавьте новую запись в раздел системных вызовов:

    {"names ": [" perf_event_open "]," action ":" SCMP_ACT_ALLOW "},

  • Добавьте в команду следующую команду для запуска контейнера: --security-opt seccomp = path /to / default.json

Это сделало это для меня.

...