web-dev-qa-db-fra.com

comment puis-je créer un conteneur de données uniquement à l'aide de docker-compose.yml?

Cette question provient d'un problème sur le référentiel de Docker:
https://github.com/docker/compose/issues/942

Je n'arrive pas à comprendre comment créer un conteneur de données (aucun processus en cours d'exécution) avec docker compose.

29
ivan

Cela dépend un peu de l'image que vous utilisez pour votre conteneur de données uniquement. Si votre image a une entrypoint, vous devez l'écraser dans votre docker-compose.yml. Par exemple, il s’agit d’une solution pour l’image officielle MySql de docker hub:

DatabaseData:
  image: mysql:5.6.25
  entrypoint: /bin/bash

DatabaseServer:
  image: mysql:5.6.25
  volumes_from:
    - DatabaseData
  environment:
    MYSQL_ROOT_PASSWORD: blabla

Lorsque vous faites un docker-compose up à ce sujet, vous obtenez un conteneur comme ..._DatabaseData_1 qui affiche un statut de Exited lorsque vous appelez docker ps -a. Un examen plus approfondi avec docker inspect indiquera qu'il a un horodatage de 0. Cela signifie que le conteneur n'a jamais été exécuté. Comme il est indiqué par le propriétaire de docker compose ici .

Maintenant, tant que vous ne faites pas un docker-compose rm -v, votre conteneur de données uniquement (..._DatabaseData_1) ne perdra pas ses données. Vous pouvez donc faire docker-compose stop et docker-compose up aussi souvent que vous le souhaitez.

Si vous souhaitez utiliser une image dédiée aux données, telle que tianon/true, cela fonctionne de la même manière. Ici, vous n'avez pas besoin d'écraser la entrypoint, car elle n'existe pas. Il semble que cette image et cette composition de docker posent quelques problèmes. Je ne l'ai pas essayé, mais cet article pourrait être utile de lire au cas où vous rencontriez des problèmes.

En général, il semble judicieux d'utiliser la même image pour votre conteneur de données uniquement que pour le conteneur qui y accède. Voir Folie du conteneur de données uniquement pour plus de détails.

25
Jan Suchotzki

Un conteneur de données uniquement (DOC) est un conteneur créé uniquement pour servir de fournisseur de volume. Le conteneur lui-même n'a pas d'autre fonction que celle de permettre aux autres conteneurs de monter son volume à l'aide de la directive volumes_from.

Le DOC ne doit être exécuté qu'une seule fois pour créer le volume. D'autres conteneurs peuvent référencer les volumes qu'il contient même s'il est arrêté.

La question OP: Le docker-compose.yml démarre le DOC chaque fois que vous effectuez un docker-compose up. OP demande une option pour créer uniquement un conteneur et un volume, et non pour l'exécuter, en utilisant une sorte d'option create_only: true

Comme mentionné dans le numéro de la question du PO:

  • vous créez un conteneur de données avec le même nom que celui spécifié dans le docker-compose.yml et exécutez docker-compose up --no-recreate (celui spécifié dans docker-compose.yml ne sera pas recréé).
  • ou vous exécutez un conteneur avec une commande simple qui ne retourne jamais.
    Comme: tail -f /dev/null
0
VonC