Docker-compose up funciona perfectamente localmente, pero en GCP obtengo un error que dice “no se pudo traducir el nombre de host db a una dirección: fallo temporal en la resolución de nombres”.
Usted es un traductor del español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en formato markdown.
línea 187, en getnuevaconexión conexión = Database.connect(*params_conexión) Archivo “/usr/local/lib/python3.9/site-packages/psycopg2/init.py”, línea 122, en connect conn = _connect(dsn, connection_factory=factoría_conexión, *kwasync) django.db.utils.OperationalError: no se pudo traducir el nombre de host “db” a dirección: error temporal en la resolución del nombre
En mi máquina local todo funciona perfectamente.
Mi archivo docker
FROM python:3.9-slim-buster
<h1>RUN apt-get update && apt-get install -y libpq-dev \</h1>
<h1>gcc \</h1>
<h1>cliente-postgresql</h1>
<h1>establecer directorio de trabajo</h1>
WORKDIR /opt/app
<h1>establecer variables de entorno</h1>
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
<h1>instalar dependencias</h1>
RUN pip install --upgrade pip
COPY ./requirements.txt /opt/app/requirements.txt
RUN chmod +x /opt/app/requirements.txt
RUN pip install -r requirements.txt
<h1>copiar proyecto</h1>
COPY . /opt/app/
RUN chmod +x /opt/app/docker-entrypoint.sh
EXPOSE 8000
ENTRYPOINT ["/opt/app/docker-entrypoint.sh"]
Aquí está mi archivo docker-compose.yml
version: '3.9'
services:
db:
image: postgres
restart: always
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_PASS=postgres
volumes:
- postgres_data:/var/postgres/data/
app:
restart: always
build:
context: .
dockerfile: Dockerfile
command: python manage.py runserver 0.0.0.0:8000
container_name: myproj
volumes:
- ./app/:/usr/src/app/
ports:
- "8000:8000"
depends_on:
- db
volumes:
postgres_data:
driver: local
Mi punto de entrada
echo "Aplicar migraciones de base de datos"
python manage.py makemigrations
python manage.py migrate
echo "Iniciando servidor"
python manage.py runserver 0.0.0.0:8000
exec "$@"
mis ajustes de base de datos
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': '5432',
}
Lo que he intentado
- Empujar el contenedor de la base de datos por separado, pero falla al iniciar.
> Error de Cloud Run: el contenedor no se inició. No se pudo iniciar y escuchar en el puerto definido por la variable de entorno PORT
He configurado el puerto en 5432, intenté ejecutarlo en el puerto 80, aún no puede iniciarse
Mis contenedores de aplicaciones no pueden iniciarse ya que no pueden conectarse al contenedor de la base de datos
no se pudo traducir el nombre de host db a dirección: error temporal en la resolución del nombre
davy.ai
El mensaje de error “could not translate host name ‘db’ to address: Temporary failure in name resolution” sugiere que el contenedor de la aplicación está teniendo problemas para resolver el nombre de host del contenedor de la base de datos. Esto podría indicar un problema de DNS dentro de la red de Docker.
Para depurar el problema, puede intentar los siguientes pasos:
Verifique que el contenedor de la base de datos esté en ejecución y tenga una dirección IP válida ejecutando
docker-compose ps
.Verifique que el contenedor de la aplicación pueda alcanzar el contenedor de la base de datos ejecutando
docker-compose exec app ping db
. Si falla, esto indica un problema de red dentro de la red de Docker.Intente usar la dirección IP del contenedor de la base de datos en lugar del nombre de host. Actualice la configuración de la base de datos en Django para que use la dirección IP del contenedor de la base de datos en lugar de ‘db’.
Verifique la configuración de DNS en su red de Docker. Si está utilizando una red personalizada con Docker, puede ser necesario configurar DNS manualmente.
Intente reiniciar el daemon de Docker y/o reconstruir los contenedores para descartar cualquier problema temporal.
Si el problema persiste, puede valer la pena buscar opciones de implementación alternativas, como implementar en un clúster de Kubernetes en lugar de Cloud Run, lo que podría ofrecer más flexibilidad con la configuración de redes y DNS.