J'ai actuellement un système construit avec docker-compose, il crée une application Django.
Jusqu'à présent, j'ai utilisé une base de données à l'intérieur d'un conteneur (postgresql) dans ma version de test. Maintenant, j'ai changé la base de données de ce conteneur en une instance RDS dans AWS.
En utilisant Pg_dump, j'ai recréé la base de données dans RDS et changé le settings.py, tout était censé être normal. J'ai accédé aux données de la base de données dans ma webapp sans aucun problème.
Tout allait bien jusqu'à ce que je doive faire une migration. Sans le conteneur de base de données, le conteneur Django me donne ce message:
Django.db.utils.OperationalError: impossible de traduire le nom d'hôte "db" en adresse: nom ou service inconnu
Mon fichier Docker-compose.yml avant les modifications:
version: '2'
services:
db:
image: postgres:9.5
restart: always
environment:
POSTGRES_USER: testing
POSTGRES_PASSWORD: tests
POSTGRES_DB: test
volumes:
- /dbdata:/var/lib/postgresql/data
Django:
build: ./Django
command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
restart: always
volumes:
- ./Django:/usr/src/app
- ./Django/static:/usr/src/app/contactto/static
ports:
- "8000:8000"
depends_on:
- db
Maintenant, après les changements:
version: '2'
services:
Django:
build: ./Django
command: gunicorn contactto.wsgi:application -b 0.0.0.0:8000
restart: always
volumes:
- ./Django:/usr/src/app
- ./Django/static:/usr/src/app/contactto/static
ports:
- "8000:8000"
Et les BASES DE DONNÉES de settings.py. Avant:
DATABASES = {
'default': {
'ENGINE': 'tenant_schemas.postgresql_backend',
'NAME': 'testing',
'USER': 'test',
'PASSWORD': 'test',
'Host': 'db',
'PORT': '5432',
}
}
Après:
DATABASES = {
'default': {
'ENGINE': 'tenant_schemas.postgresql_backend',
'NAME': 'testing',
'USER': 'test',
'PASSWORD': 'test',
'Host': 'xxx.rds.amazonaws.com',
'PORT': '5432',
}
}
La chose étrange est que je peux utiliser la base de données aws dans mon application ... Je peux créer des utilisateurs et faire des choses à l'intérieur de la base de données et les changements apparaissent. Maintenant, dans l'interface CLI, je ne peux même pas utiliser le shell manage.py sans le message.
Je suis complètement perdu.
Répondant à ma question, c'était stupide ...
Mon manage.py ne sélectionnait que le fichier de paramètres base.py et ne tenait pas compte du fichier de paramètres staging.py. Donc, il se brisait dans la CLI et ne se brisait pas à l'intérieur de l'application.
Dans la partie "Django" de votre docker-compose.yml sous la section "depend_on", essayez d'ajouter links: - db:db
Après cela, ou même remplacez le depend_on: db par cela.
Je parie que si vous avez tapé docker logs (container name)
vous verriez qu'il est évidemment difficile de trouver où "db" pointe.
Je pense qu'ils cherchent à mettre fin à la prise en charge des liens dans docker-compose dans de nouvelles itérations au moins je l'ai lu quelque part ..
Aux autres qui vivent cela.
La commande suivante (qui supprime tous les conteneurs, réseaux, images et éventuellement volumes inutilisés) résout mon problème:
docker system Prune
Voir document docker pour plus d'informations