línea 187, en get_new_connection conexión = Database.connect(**conn_params) Archivo "/usr/local/lib/python3.9/site-packages/psycopg2/ init .py", línea 122, en conexión conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: no se pudo traducir el nombre de host "db" a la dirección: falla temporal en la resolución de nombres
En mi máquina local todo funciona perfectamente.
mi archivo docker
FROM python:3.9-slim-buster # RUN apt-get update && apt-get install -y libpq-dev \ # gcc \ # postgresql-client # set work directory WORKDIR /opt/app # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # install dependencies 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 # copy project COPY . /opt/app/ RUN chmod +x /opt/app/docker-entrypoint.sh EXPOSE 8000 ENTRYPOINT [ "/opt/app/docker-entrypoint.sh" ]Aquí está mi 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: localmi punto de entrada
echo "Apply database migrations" python manage.py makemigrations python manage.py migrate echo "Starting server" python manage.py runserver 0.0.0.0:8000 exec "$@"la configuración de mi base de datos
'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': "5432" }lo que he intentado
Error de Cloud Run: el contenedor no pudo iniciarse. No se pudo iniciar y luego escuchar en el puerto definido por la variable de entorno PORT
Configuré el puerto en 5432, intenté ejecutarlo en el puerto 80 y aún no se conecta
Los contenedores de mi aplicación no se inician porque no se pueden conectar al contenedor db
no se pudo traducir el nombre de host db a la dirección: falla temporal en la resolución de nombres
Sobre la base de las bases de datos de contenedores y comentarios de John Hanley, tampoco se recomienda alojar un servicio de base de datos (PostgreSQL, MySQL, etc.) en servicios como Cloud Run. Puede revisar hilos relacionados aquí y aquí . En resumen, los contenedores sin estado que pueden escalar hacia arriba y hacia abajo, además de no tener almacenamiento persistente , interferirían con el funcionamiento correcto de una base de datos. Como está utilizando GCP, puede optar por otros servicios que ya se ofrecen, como CloudSQL. Cloud SQL le permite crear instancias de PostgreSQL y puede integrarse con las aplicaciones alojadas de Cloud Run .
De los comentarios de John Hanley esto es lo que hice,
creé una instancia postgresql de sql en la nube y configuré mi base de datos (ip interna)
para conexiones de base de datos
DATABASES = {'default': env.db()} # # If the flag as been set, configure to use proxy if os.getenv("USE_CLOUD_SQL_AUTH_PROXY", None): DATABASES["default"]["HOST"] = "cloudsql-proxy" DATABASES["default"]["PORT"] = 5432 Ejecute gcloud run deploy --source . para implementar el proyecto actual (consulte a continuación el archivo docker)
En la ejecución en la nube, edite e implemente una nueva versión en el contenedor, configure su puerto, por defecto es 8080, en variables y conexiones (si está usando env), configure sus variables env. por ejemplo, SECRET_KEY , DATABASE_URL , GOOGLE_CLOUD_PROJECT , GS_BUCKET_NAME , en conexiones,
por ejemplo, archivo .env
SECRET_KEY=mysupersecretkey GS_BUCKET_NAME=mybucket GOOGLE_CLOUD_PROJECT=myprojid DATABASE_URL=postgres://dbuser:<db pass>@//cloudsql/projid:us-central1:instancename/dbnameconecte su instancia a la instancia de postgresql que creó anteriormente
bajo seguridad, es posible que desee cambiar la cuenta de servicio, no es necesario
aquí está mi archivo docker de muestra
FROM python:3.9 WORKDIR /opt/app # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # install dependencies 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 RUN adduser --disabled-password --no-create-home django-user # copy project COPY . /opt/app/ RUN chmod +x /opt/app/docker-entrypoint.sh EXPOSE 8000 ENTRYPOINT [ "/opt/app/docker-entrypoint.sh" ] CMD execComponer ventana acoplable
version: '3.9' services: app: container_name: myname build: context: . ports: - "8000:8000" volumes: - ./src/:/usr/src/app/ - ./d_creds.json:/secrets/d_creds.json env_file: - ./.env restart: always # The proxy will help us connect to remote CloudSQL instance locally. # Make sure to turn off any VPNs for the proxy to work. cloudsqlproxy: container_name: cloudsql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.19.1 volumes: - ./d_creds.json:/secrets/cloudsql/d_creds.json ports: - "127.0.0.1:5432:5432" command: /cloud_sql_proxy -instances="projid:zone:instance-name"=tcp:0.0.0.0:5432 -credential_file=/secrets/cloudsql/d_creds.json restart: alwayspara el punto de entrada .sh
#!/bin/bash python3 manage.py makemigrations python3 manage.py migrate exec "$@"