Docker: невозможно проверить postgresql соединение - PullRequest
0 голосов
/ 21 апреля 2020

Я следую учебнику по Python / TDD / Docker от TestDriven.io.

Я создаю собственное изображение и хочу его протестировать. Я не могу (я думаю, я нуб с Docker и Python, пожалуйста, терпение) сделать.

Это изображение: registry.gitlab.com/sineverba/warehouse:latest. Это работает, потому что я успешно развернул в Heroku.

Я не хочу docker -компоновать для тестирования окончательного образа, поэтому я попытался сделать:

docker network create -d bridge flask-tdd-net

export DATABASE_TEST_URL=postgres://postgres:postgres@flask-tdd-net:5432/users_dev

docker run -d --name app -e "PORT=8765" -p 5002:8765 --network=flask-tdd-net registry.gitlab.com/sineverba/warehouse:latest

docker run -d --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=users_dev -p 5432:5432 --network=flask-tdd-net postgres:12-alpine

Я могу запустить например,

docker exec app python -V и получить версию.

Но когда я запускаю

docker exec app python -m pytest "project/tests"

, я получаю (разделить, полный войдите сюда: https://pastebin.com/tYjn65ys)

self = <[AttributeError("'NoneType' object has no attribute 'drivername'") raised in repr()] SQLAlchemy object at 0x7fc74676e7f0>
app = <Flask 'project'>, sa_url = None, options = {}

    def apply_driver_hacks(self, app, sa_url, options):
        """This method is called before engine creation and used to inject
       driver specific hacks into the options.  The `options` parameter is
       a dictionary of keyword arguments that will then be used to call
       the :func:`sqlalchemy.create_engine` function.

       The default implementation provides some saner defaults for things
       like pool sizes for MySQL and sqlite.  Also it injects the setting of
       `SQLALCHEMY_NATIVE_UNICODE`.
       """
>       if sa_url.drivername.startswith('mysql'):
E       AttributeError: 'NoneType' object has no attribute 'drivername'

Я тоже попробовал (после остановки и удаления контейнеров и воссоздания БД)

export DATABASE_TEST_URL=postgres://postgres:postgres@db:5432/users

Итак, перемещение имени из users_dev пользователям.

Полная ссылка репо: https://github.com/sineverba/flask-tdd-docker/tree/add-gitlab-warehouse

Заранее спасибо!

Редактировать

Я изменил env, потому что ссылка db была неправильной. Это новые команды, но они получили ту же ошибку. Я попытался также экспортировать оба env, но безуспешно.

docker network create -d bridge flask-tdd-net
export DATABASE_TEST_URL=postgres://postgres:postgres@db:5432/users
export DATABASE_URL=postgres://postgres:postgres@db:5432/users
docker run -d --name app -e "PORT=8765" -p 5002:8765 --network=flask-tdd-net registry.gitlab.com/sineverba/warehouse:latest
docker run -d --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=users -p 5432:5432 --network=flask-tdd-net postgres:12-alpine

docker exec app python -m pytest "project/tests"


docker container stop app && docker container rm app && docker container stop db && docker container rm db

Начальный пример

Это пример testdriven.io из интеграции с Gitlab (который я не хочу использовать). Только env, экспортированный для приложения, является DATABASE_TEST_URL

image: docker:stable

stages:
  - build
  - test

variables:
  IMAGE: ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}

build:
  stage: build
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $IMAGE:latest || true
    - docker build
        --cache-from $IMAGE:latest
        --tag $IMAGE:latest
        --file ./Dockerfile.prod
        "."
    - docker push $IMAGE:latest

test:
  stage: test
  image: $IMAGE:latest
  services:
    - postgres:latest
  variables:
    POSTGRES_DB: users
    POSTGRES_USER: runner
    POSTGRES_PASSWORD: runner
    DATABASE_TEST_URL: postgres://runner:runner@postgres:5432/users
  script:
    - pytest "project/tests" -p no:warnings
    - flake8 project
    - black project --check
    - isort project/**/*.py --check-only

Решено

Ошибка заключается в необходимости экспортировать переменные внутри команды docker:

docker run -d --name app -e "PORT=8765" -p 5002:8765 -e "DATABASE_TEST_URL=postgres://postgres:postgres@db:5432/users" --network=flask-tdd-net registry.gitlab.com/sineverba/warehouse:latest

1 Ответ

0 голосов
/ 21 апреля 2020

Ошибка заключается в необходимости экспортировать переменные внутри команды docker:

docker run -d --name app -e "PORT=8765" -p 5002:8765 -e "DATABASE_TEST_URL=postgres://postgres:postgres@db:5432/users" --network=flask-tdd-net registry.gitlab.com/sineverba/warehouse:latest

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...