tail -f não segue o arquivo de log no contêiner do Docker

7

Estou vendo um comportamento estranho executando o comando tail -f dentro de um contêiner do Docker no CoreOS.

Existem várias variáveis que podem estar contribuindo para o problema, mas não tenho certeza do que preciso fazer para solucionar o problema primeiro. No CoreOS, estou executando a versão mais recente com suporte a overlayfs, bem como uma versão mais recente do Docker (1.4.1).

O que é interessante é que eu sou capaz de completar logs com sucesso em um sistema operacional host diferente (Ubuntu 14.04) que está executando uma versão diferente do Docker (1.3).

Eu posso produzir registros de strace se isso ajudar a solucionar problemas, eles parecem ser significativamente diferentes entre os hosts. Por exemplo, no host que não está funcionando, o strace para depois de ler o seguinte na saída 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>

Eu não estou familiarizado o suficiente com o strace para ser muito bom em interpretar os resultados.

    
por jmreicha 22.01.2015 / 06:36

2 respostas

4

Não é uma solução, mas uma solução alternativa:

Eu tenho o mesmo problema no CoreOS 607.0.0 e reproduzi esse problema em containers baseados no Ubuntu ou no Fedora. No entanto, os contêineres que usam o busybox não têm esse problema. Duas soluções alternativas:

1) use uma imagem de contêiner baseada em busybox, como alpine

2) instale o busybox no seu contêiner existente e execute

busybox tail -F <logfile>
    
por 31.03.2015 / 11:28
3

Este é um bug introduzido no CoreOS 561 quando o sistema de arquivos padrão foi alterado de btrfs para o overlayfs. Eu encontrei uma solução alternativa para basicamente formatar o sistema de arquivos usando o btrfs quando um host é iniciado pela primeira vez, e que parece estar funcionando por enquanto.

Inclua o seguinte no seu 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
    
por 10.07.2015 / 03:24