Назад | Перейти на главную страницу

tail -f не следует за файлом журнала в контейнере Docker

Я наблюдаю странное поведение при запуске tail -f команда внутри контейнера Docker в CoreOS.

Я могу представить себе ряд переменных, которые могут способствовать возникновению проблемы, но я не уверен, что мне нужно сделать для устранения неполадок в первую очередь. В CoreOS я использую новейшую версию с поддержкой overlayfs, а также более новую версию Docker (1.4.1).

Интересно то, что я могу успешно отслеживать журналы на другой ОС (Ubuntu 14.04), на которой работает другая версия Docker (1.3).

Я могу создать журналы strace, если это поможет в устранении неполадок, они, похоже, значительно различаются между хостами. Например, на хосте, который не работает, strace останавливается после прочтения следующего в выводе strace:

04:03:03 inotify_add_watch(4, "f017f0a1-a1e9-11e4-90bc-027e0f87cac6-paster.log", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000028>
04:03:03 fstat(3, {st_mode=S_IFREG|0644, st_size=12229, ...}) = 0 <0.000022>
04:03:03 read(4, 0x7711f0, 64)          = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <3.101545>

Я просто недостаточно знаком со strace, чтобы хорошо интерпретировать результаты.

Не решение, а обходной путь:

У меня такая же проблема с CoreOS 607.0.0, и я воспроизвел эту проблему в контейнерах на основе Ubuntu или Fedora. Однако контейнеры, использующие busybox, не имеют этой проблемы. Два обходных пути:

1) используйте образ контейнера на основе busybox, например alpine

2) установите busybox в существующий контейнер и запустите

busybox tail -F <logfile>

Это ошибка введено в CoreOS 561, когда файловая система по умолчанию была изменена с btrfs на overlayfs. Я нашел обходной путь в основном форматировать файловую систему с помощью btrfs при первом запуске хоста, и, похоже, сейчас это работает.

Включите в свой CloudInit следующее:

#cloud-config
coreos:
  units:
    - name: format-var-lib-docker.service
      command: start
      content: |
        [Unit]
        Before=docker.service var-lib-docker.mount
        ConditionPathExists=!/var/lib/docker.btrfs
        [Service]
        Type=oneshot
        ExecStart=/usr/bin/truncate --size=25G /var/lib/docker.btrfs
        ExecStart=/usr/sbin/mkfs.btrfs /var/lib/docker.btrfs
    - name: var-lib-docker.mount
      enable: true
      content: |
        [Unit]
        Before=docker.service
        After=format-var-lib-docker.service
        Requires=format-var-lib-docker.service
        [Install]
        RequiredBy=docker.service
        [Mount]
        What=/var/lib/docker.btrfs
        Where=/var/lib/docker
        Type=btrfs
        Options=loop,discard