web-dev-qa-db-fra.com

docker-compose: partage de conteneur entre plusieurs projets en utilisant le même nom de conteneur

Je souhaite utiliser un conteneur Docker MySQL pour plusieurs projets exécutés sur le même serveur.

En utilisant les fichiers docker-compose v3, j'ai simplement la même configuration de conteneur mysql dans chacun des projets, et ils ont le même container_name:

version: "3"

services:
  app1:
    image: foo
    links:
      - mysql

  mysql:
    image: mysql/mysql:5.7
    container_name: shared_mysql

La deuxième application a un docker-compose.yml fichier, mais avec app2 au lieu de app1.

Lors de l'exécution docker-compose up --no-recreate pour app2, J'obtiens une erreur:

Creating shared_mysql ... error
ERROR: for shared_mysql
Cannot create container for service mysql: Conflict.
The container name "/shared_mysql" is already in use by container "deadbeef".
You have to remove (or rename) that container to be able to reuse that name.

Que puis-je faire pour partager le conteneur MySQL entre plusieurs projets Docker?

20
cweiske

Vous pouvez simplement éviter de redéfinir le mysql dans l'un des deux fichiers docker-compose.yml et connecter mysql et les autres conteneurs au même réseau.

Pour ce faire, créez un réseau:

docker network create shared

Attribuez votre réseau à votre conteneur mysql:

version: '3'
services:
  mysql:
    ...
    networks:
    - shared
networks:
  shared: 
    external:
      name: shared

Pour tout autre conteneur qui a besoin d'accéder à mysql, ajoutez simplement la même définition de réseau que ci-dessus:

version: '3'
services:
  app1:
    ...
    networks:
    - shared
  app2:
    ...
    networks:
    - shared
  ...
networks:
  shared: 
    external:
      name: shared
14
whites11

Si votre conteneur n'est créé qu'à partir d'un autre fichier de composition, vous pouvez utiliser la fonction liens externes dans docker-compose.

Si vous voulez que les deux fichiers de composition de docker puissent créer le conteneur mysql, je vous suggère de regarder dans Partager les configurations de composition entre les fichiers et les projets . Dans ce cas, vous pouvez créer un fichier de base qui ne définit que mysql et l'étendre/fusionner dans les deux fichiers de composition des applications.

5
yamenk

Nous le résolvons en utilisant un troisième projet comprenant tous les services partagés que nos micro-services utilisent comme mysql, kafka et redis.

dans chacun de nos fichiers docker-compose, nous avons ajouté des liens externes vers ces services.

C'est un peu sale mais ça marche bien.

Vous pouvez suivre ce problème sur github, https://github.com/docker/compose/issues/2075 qui parle du même problème que vous rencontrez.

2
Yuri Ritvin