psycopg2 не может подключиться к базе данных postgres в докеризированном приложении Python-Flask - PullRequest
0 голосов
/ 07 июля 2019

Я работаю над проектом Python-Flask, в котором есть один докер-контейнер для веб-приложения и другой докер-контейнер для базы данных postgres.Я использую virtualenv для управления всеми своими зависимостями.После некоторых начальных проблем с установкой psycopg2 теперь у меня установлены все зависимости.Но я получаю ошибку psycopg2 каждый раз, когда пытаюсь запустить flask db migrate из командной строки.Посмотрите фрагмент ошибки ниже:

File "/home/myuser/Workspace/GroupName/MyApp/env/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate host name "postgres" to address: Temporary failure in name resolution


The above exception was the direct cause of the following exception:
  File "/home/myuser/Workspace/GroupName/MyApp/env/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not translate host name "postgres" to address: Temporary failure in name resolution

Вот мой docker-compose.yml

services:
 postgres:
   restart: always
   image: postgres:latest
   environment:
     POSTGRES_USER: MyApp
     POSTGRES_PASSWORD: fakepassword
     POSTGRES_DB: MyApp-dev
   volumes:
     - ./container_data/postgres:/var/lib/postgresql/data
   ports:
     - "5432:5432"

 web:
   restart: always
   build:
      context: .
      args:
      - DOCKER_BUILD_ENV
      dockerfile: ./dockerfiles/web/Dockerfile
   environment:
     AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
     AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
     AWS_DEFAULT_REGION: "${AWS_DEFAULT_REGION}"
     S3_BUCKET_NAME: "${S3_BUCKET_NAME}"
     APPROVE_REGISTRATIONS: "${APPROVE_REGISTRATIONS}"
     FLASK_APP: app
     FLASK_ENV: "${FLASK_ENV:-development}"
   volumes:
     - ./MyApp/:/usr/src/app/MyApp/:z
   links:
     - postgres:postgres
   expose:
     - "3000"
   command: scripts/entrypoint.sh
   ports:
     - "3000:3000"

Вот выдержки из dockerfile, относящиеся к requirements.txt и базе данных.

.....
RUN pip3 install --no-cache-dir virtualenv
RUN virtualenv /ve
ENV PATH=/ve/bin:$PATH
........

USER www-data

COPY requirements.txt dev-requirements.txt /usr/src/app/
RUN pip3 install --no-cache-dir -r requirements.txt

ARG DOCKER_BUILD_ENV
RUN test "${DOCKER_BUILD_ENV}" = production || pip3 install --no-cache-dir -r dev-requirements.txt

CMD ["/bin/bash"]
COPY package.json /usr/src/app/
RUN yarn

COPY create_db.py test_data.py /usr/src/app/
EXPOSE 3000

ENV PATH="/usr/src/app/geckodriver:${PATH}"
ENV SECRET_KEY *************
ENV SQLALCHEMY_DATABASE_URI postgresql://MyApp:fakepassword@postgres/MyApp-dev

WORKDIR /usr/src/app/MyApp

CMD ["scripts/entrypoint.sh"]

Вот entrypoint.sh.Я не думаю, что это вызвало ошибку, потому что я столкнулся с ошибкой при запуске flask db migrate из командной строки, а не из этого скрипта.

#!/bin/bash
if [ "${DOCKER_BUILD_ENV:-}" == "production" ]; then
    flask run --host=0.0.0.0 --port=3000
else
    yarn build
    yarn watch &
    flask run --host=0.0.0.0 --port=3000
fi

Я посмотрел похожие вопросы, например psycopg2 canя не вижу мой экземпляр PostgreSQL , но в моем коде нет нигде, чтобы я явно использовал psycopg2 для создания соединения.Самая близкая вещь находится в верхней части models.py, где я поставил:

db = SQLAlchemy()

Я запустил docker ps и подтвердил, что обе службы работают.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a1e6891161d1        myapp_web   "scripts/entrypoint.…"   57 minutes ago      Up 57 minutes       0.0.0.0:3000->3000/tcp   myapp_web_1
bfa83d282ac7        postgres:latest     "docker-entrypoint.s…"   2 weeks ago         Up 57 minutes       0.0.0.0:5432->5432/tcp   myapp_postgres_1

Есть идеи, почему я не могу запустить flask db migrate или flask db stamp head из командной строки, когда я нахожусь в virtualenv?

...