Я следую учебнику по 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