python-3.x - 如何配置 postgresql 以在 BitBucket Pipelines 中运行 FastAPI 测试
问题描述
我正在尝试为我正在处理的 FastAPI 样板设置管道。到目前为止我失败了,我不知道为什么。这是我所拥有的:
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: *test
我正在使用以下方式连接到我的数据库:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://postgres@localhost/postgres')
这是我运行管道时遇到的错误:
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?
E
E (Background on this error at: http://sqlalche.me/e/13/e3q8)
我添加了postgresql://postgres@localhost/postgres
因为这就是 BitBucket 为默认用户设置 postgresql 的方式。我究竟做错了什么?
解决方案
根据我在 这篇文章中找到的内容,这里有一个片段:
如果您需要从 docker 中运行的服务与构建容器中运行的服务进行通信,请在启动服务时使用 --add-host host.docker.internal:$BITBUCKET_DOCKER_HOST_INTERNAL 为其提供以下主机条目,然后您可以访问该服务使用 host.docker.internal:port
我应该指定host.docker.internal
为我的主机:
DATABASE_URL = os.getenv('DATABASE_URL', 'postgresql://postgres@host.docker.internal/postgres')
而不是使用localhost
另一种方法是执行以下操作:
DATABASE_URL = os.getenv('DATABASE_URL')
然后,而不是做docker run --env POSTGRES_HOS=host.docker.internal
,只是做:
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
推荐阅读
- flask - 如何使 WTForms 中的两个 FormField 中的至少一个成为必需的?
- java - 为最后一次出现的字符拆分字符串
- javascript - 如何在 Sequelize 中生成 12 位唯一 ID?
- javascript - 字符串连接 object.values 其中 object.key 等于条件
- java - 在 JTable 中单击鼠标,图像在 JLabel 中不可见
- swift - 有条件地符合 Set 到 ExpressibleByDictionaryLiteral 协议
- python - 在python函数中将值与文本组合
- xml - SerializationFeature.WRITE_DATES_WITH_ZONE_ID 没有给我预期的结果
- python - Edge webdriver 在 SharePoint 网站上找不到对 Firefox 驱动程序可见的元素
- javascript - 如何使主菜单中的滚动链接仅在单击时处于活动状态?