Estoy tratando de configurar canalizaciones para un modelo de FastAPI en el que estoy trabajando. Lo que he fallado hasta ahora y no puedo entender por qué. Esto es lo que tengo:
bitbucket-pipelines.yml
image: python:3.7.4-slim-buster options: max-time: 5 definitions: steps: - step: &test name: test script: - >- docker build -f {{cookiecutter.app_name}}/{{cookiecutter.service_name}}/tests.dockerfile -t boilerplate ./{{cookiecutter.app_name}}/{{cookiecutter.service_name}} - >- docker run --env POSTGRES_HOST=host.docker.internal --add-host host.docker.internal:$BITBUCKET_DOCKER_HOST_INTERNAL boilerplate /bin/bash -c /run-tests.sh services: - docker - postgres caches: - docker services: postgres: image: postgres environment: POSTGRES_HOST_AUTH_METHOD: trust pipelines: pull-requests: '**': - step: *testMe estoy conectando a mi base de datos con:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://postgres@localhost/postgres')Aquí está el error que obtuve cuando ejecuté la canalización:
E sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused E Is the server running on host "localhost" (127.0.0.1) and acceptingE TCP/IP connections on port 5432? EE (Background on this error at: http://sqlalche.me/e/13/e3q8) postgresql://postgres@localhost/postgres porque así es como BitBucket configura postgresql para un usuario predeterminado. ¿Qué estoy haciendo mal?
Basado en lo que encontré en este artículo , aquí hay un fragmento:
Si necesita comunicarse desde un servicio que se ejecuta en docker a un servicio que se ejecuta en su contenedor de compilación, al iniciar el servicio, proporcione la siguiente entrada de host usando --add-host host.docker.internal:$BITBUCKET_DOCKER_HOST_INTERNAL y podrá acceder al servicio usando host.docker.internal:port
Se suponía que debía especificar host.docker.internal como mi host:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://postgres@host.docker.internal/postgres') en lugar de usar localhost
Otro enfoque sería hacer lo siguiente:
DATABASE_URL = os.getenv('DATABASE_URL') luego, en lugar de docker run --env POSTGRES_HOS=host.docker.internal , solo haz lo siguiente:
definitions: steps: - step: &test name: test script: ... ... - >- docker run --env DATABASE_URL=postgresql://postgres@host.docker.internal/postgres --add-host host.docker.internal:$BITBUCKET_DOCKER_HOST_INTERNAL boilerplate /bin/bash -c /run-tests.sh