Существует похожая тема , у которой та же проблема, но она не смогла работать на меня.По сути, я пытаюсь выполнить юнит-тест myproject
с помощью testing.postgresql
и запускаю его в контейнере докера.
Однако при выполнении команды я получаю RuntimeError: command not found: initdb
,
docker-compose exec myproject python3 -m unittest
Это работает в WSL, но не в докере.
Похоже, он не может найти initdb.Возникают ли проблемы с базой данных, созданной в docker-compose.yml, или я пропускаю некоторые строки в файлах docker?
Я набросал свой тест, как пример из docs :
class TestPostgresqlInteraction(unittest.TestCase):
Postgresql = testing.postgresql.PostgresqlFactory(cache_initialized_db=True)
with testing.postgresql.Postgresql() as postgresql:
engine = create_engine(postgresql.url())
dbConn = psycopg2.connect(**postgresql.dsn())
cursor = dbConn.cursor()
def setUp(self):
self.postgresql = self.Postgresql()
def tearDown(self):
self.postgresql.stop()
def testMethod(self)
conn = psycopg2.connect(**self.postgresql.dsn())
cursor = conn.cursor()
# execute cursor and do tests...
def tearDownModule(self):
self.Postgresql.clear_cache()
docker-compose.yml
version: "3"
services:
myproject:
build:
context: .
dockerfile: ./myproject/Dockerfile
depends_on:
- database
volumes:
- ./myproject:/code
stdin_open: true
tty: true
database:
build:
context: .
dockerfile: ./database/Dockerfile
environment:
POSTGRES_USER_FILE: /secrets/dbUser.txt
POSTGRES_PASSWORD_FILE: /secrets/dbPassword.txt
ports:
- "8765:5432"
volumes:
- otherdata:/var/lib/postgresql/data
myproject / Dockerfile
FROM python:3.7.3-stretch
RUN apt-get update && apt-get install -y \
poppler-utils
ARG moduleDir=myproject
WORKDIR /code
COPY secrets/ /secrets
# COPY $moduleDir/myproject/ ./
COPY $moduleDir/requirements.txt requirements.txt
RUN pip install -r requirements.txt
база данных / Dockerfile
FROM postgres:11.3
WORKDIR /secrets
COPY secrets/dbUser.txt dbUser.txt
COPY secrets/dbPassword.txt dbPassword.txt
RUN mkdir -p /docker-entrypoint-initdb.d
COPY database/schema.sql /docker-entrypoint-initdb.d
трассировка:
ImportError: Failed to import test module: tests.testMyproject
File "/usr/local/lib/python3.7/unittest/loader.py", line 436, in _find_test_path
module = self._get_module_from_name(name)
File "/usr/local/lib/python3.7/unittest/loader.py", line 377, in _get_module_from_name
__import__(name)
File "/code/tests/testmyProject.py", line 40, in <module>
class TestPostgresqlInteraction(unittest.TestCase):
File "/code/tests/testmyProject.py", line 46, in TestPostgresqlInteraction
Postgresql = testing.postgresql.PostgresqlFactory(cache_initialized_db=True)
File "/usr/local/lib/python3.7/site-packages/testing/common/database.py", line 52, in __init__
self.cache = self.target_class(**settings_noautostart)
File "/usr/local/lib/python3.7/site-packages/testing/common/database.py", line 92, in __init__
self.initialize()
File "/usr/local/lib/python3.7/site-packages/testing/postgresql.py", line 50, in initialize
self.initdb = find_program('initdb', ['bin'])
File "/usr/local/lib/python3.7/site-packages/testing/postgresql.py", line 144, in find_program
raise RuntimeError("command not found: %s" % name)
RuntimeError: command not found: initdb