web-dev-qa-db-fra.com

Utilisation de docker-compose avec le pilote de journal GELF

Selon selon la documentation officielle de Docker , il est possible d'obtenir la sortie stdout et stderr d'un conteneur sous la forme messages GELF qui est un format qui est compris par exemple Graylog/Graylog2 et logstash .

Cela fonctionne bien lorsque j'exécute mes conteneurs manuellement à partir de la ligne de commande. Par exemple,

docker run --log-driver=gelf --log-opt gelf-address=udp://localhost:12201 busybox echo This is my  message.

enverra un message de journal à mon serveur Graylog2 fonctionnant sur localhost qui a un écouteur d'entrée UDP configuré sur le port 12201.

Maintenant, je veux utiliser les mêmes options de journal avec docker-compose qui, selon les documents, devrait être possible en principe . Cependant, les documents ne mentionnent aucun format de journal mais json-file, syslog et none et quand j'inclus quelque chose comme

my-container:
  container_name: ...
  build: ...
  ports: ...
  log_driver: "gelf"
  log_opt:
    gelf-address: "udp://localhost:12201"

dans mon docker-compose.yml fichier puis docker-compose up échoue avec:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 39, in main
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 21, in sys_dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 27, in dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.docopt_command", line 24, in dispatch
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.command", line 59, in perform_command
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.cli.main", line 495, in up
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.project", line 265, in up
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 369, in execute_convergence_plan
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 270, in create_container
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 643, in _get_container_create_options
  File "/code/build/docker-compose/out00-PYZ.pyz/compose.service", line 656, in _get_container_Host_config
  File "/code/build/docker-compose/out00-PYZ.pyz/docker.utils.types", line 27, in __init__
ValueError: LogConfig.type must be one of (json-file, syslog, none)

Pour mémoire, c'était sur docker-compose 1.4.0 et docker 1.8.1, build d12ea79.

Apparemment, Docker et docker-compose ne sont pas au même niveau d'implémentation ici. Je viens de découvrir que cela a déjà été résolu et inclus dans le Master branch sur Github, voir https://github.com/docker/compose/issues/1869 et https://github.com/docker/docker-py/pull/724 .

Existe-t-il un moyen de réinstaller docker-compose à partir de la branche Master actuelle ou de l'ajouter manuellement à une installation existante? Je n'ai pas pu trouver le fichier où le commit va n'importe où sur mon hôte ...

17
Dirk

Le problème a été corrigé.

Je viens de tester la connexion à graylog2 en utilisant docker-compose 1.5.0rc2

Vous pouvez essayer avec cet exemple de travail yaml:

example:
 container_name: example
 image: debian:wheezy
   command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done"
 ports:
  - "1234:1234"
 log_driver: "gelf"
 log_opt:
   gelf-address: "udp://graylog.example.com:12201"
   gelf-tag: "first-logs"

Lorsque le conteneur démarre, il y a un avertissement

example | WARNING: no logs are available with the 'gelf' log driver

Mais cela ne semble pas affecter que les messages soient envoyés à graylog.

13
Tomasz Sętkowski

Pour les services Docker-Compose v2, la syntaxe a légèrement changé, tout est maintenant dans une nouvelle section "logging":

version: "2"

services:
  example:
    container_name: example
    image: debian:wheezy
    command: /bin/sh -c "while true; do date && echo "hello"; sleep 1; done"
    ports:
      - "1234:1234"
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://graylog.example.com:12201"
        tag: "first-logs"

Une remarque importante: l'adresse de gelf-address doit être l'adresse externe du serveur, car Docker résout cette adresse via le réseau de l'hôte.

10
nwinkler