Я работаю над проектом 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?