testcontainers / testcontainers/testcontainers-python

Bug: in v4 `get_exposed_port` not working with IPv6 localhost (on MacOS, colima)

Đang mở
#553 2 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Python
Star
2.3k
Fork
386
Merge trung bình
4 giờ 40 phút
Pull request đã merge (30 ngày)
1

Mô tả

Trying to migrate from testcontainers-python v3.7.1 to v4.4.0 and get_exposed_port isn't working as expected.

Using the construct exposed_port = engine.get_exposed_port(engine.port_to_expose) works fine in v3.7.1, giving the exposed port that can be used to access the DB.
In v4.4.0 replacing this with exposed_port = engine.get_exposed_port(engine.port) doesn't work.

When running the tests I get the error below; the port number changes on every execution.

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "localhost" (::1), port 33373 failed: Connection refused

Full existing code for v3.7.1:

@pytest.fixture(scope="session", name="pg_cluster")
def postgres_cluster() -> PostgresContainer:
    with PostgresContainer(
        PG_BASE_IMAGE, dbname="postgres", user="postgres", password="postgres"
    ) as postgres:
        # run migrations
        alembic_config = AlembicConfig("alembic.ini")
        alembic_config.set_main_option("sqlalchemy.url", postgres.get_connection_url())
        upgrade(alembic_config, "head")
        yield postgres

@pytest.fixture(scope="session")
def application_config(pg_cluster: PostgresContainer) -> Iterator[ApplicationConfig]:
    config = load_application_config()
    update_host = {
        "hosts": [pg_cluster.get_container_host_ip()],
        "port": pg_cluster.get_exposed_port(pg_cluster.port_to_expose),
    }

    update_database = {
        "ddl_database": config.ddl_database.copy(update=update_host),
        "database": config.database.copy(update=update_host),
    }
    new_config = config.copy(update=update_database)
    yield new_config

Full updated code for v4.4.0:

@pytest.fixture(scope="session", name="pg_cluster")
def postgres_cluster() -> PostgresContainer:
    with PostgresContainer(
        PG_BASE_IMAGE, dbname="postgres", username="postgres", password="postgres"
    ) as postgres:
        # run migrations
        alembic_config = AlembicConfig("alembic.ini")
        alembic_config.set_main_option("sqlalchemy.url", postgres.get_connection_url())
        upgrade(alembic_config, "head")
        yield postgres

@pytest.fixture(scope="session")
def application_config(pg_cluster: PostgresContainer) -> Iterator[ApplicationConfig]:
    config = load_application_config()
    update_host = {
        "hosts": [pg_cluster.get_container_host_ip()],
        "port": pg_cluster.get_exposed_port(pg_cluster.port),
    }

    update_database = {
        "ddl_database": config.ddl_database.copy(update=update_host),
        "database": config.database.copy(update=update_host),
    }
    new_config = config.copy(update=update_database)
    yield new_config

Runtime environment

Python 3.11.9

Darwin LDN-XXXXXXXXXX 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:10:42 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6000 arm64

Docker Info
Client: Docker Engine - Community
 Version:    26.0.1
 Context:    default
 Debug Mode: false
 Plugins:
  compose: Docker Compose (Docker Inc.)
    Version:  2.26.1
    Path:     /Users/user.name/.docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 2
 Server Version: 24.0.9
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.5.0-15-generic
 Operating System: Ubuntu 23.10
 OSType: linux
 Architecture: aarch64
 CPUs: 4
 Total Memory: 5.775GiB
 Name: colima
 ID: ff9f7b4d-3e2a-426b-abc7-6c26ea211a18
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Pip

aenum==3.1.15
aiodns==3.2.0
aiohttp==3.9.5
aioresponses==0.7.6
aiosignal==1.3.1
alembic==1.13.1
alembic_utils==0.8.2
aniso8601==9.0.1
anyio==3.7.1
astroid==2.15.8
asttokens==2.4.1
attrs==23.2.0
Babel==2.14.0
beautifulsoup4==4.12.3
black==23.12.1
blinker==1.7.0
Brotli==1.1.0
cachetools==5.3.3
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
cloudpickle==3.0.0
ConfigArgParse==1.7
contourpy==1.2.1
countryguess==0.3.0
coverage==7.4.4
cryptography==42.0.5
cycler==0.12.1
datasets==2.19.0
decorator==5.1.1
Deprecated==1.2.14
deprecation==2.1.0
deptry==0.16.1
dill==0.3.8
distro==1.9.0
docker==7.0.0
elastic-transport==8.13.0
elasticsearch==8.13.0
entrypoints==0.4
evaluate==0.4.1
execnet==2.1.1
executing==2.0.1
factory-boy==3.3.0
Faker==19.13.0
fastapi==0.109.2
filelock==3.13.4
flake8==7.0.0
Flake8-pyproject==1.2.3
Flask==3.0.3
Flask-Cors==4.0.0
Flask-Login==0.6.3
flupy==1.2.0
fonttools==4.51.0
frozenlist==1.4.1
fsspec==2024.3.1
gevent==24.2.1
geventhttpclient==2.2.1
gitdb==4.0.11
GitPython==3.1.41
google-api-core==2.18.0
google-auth==2.29.0
google-cloud-core==2.4.1
google-cloud-storage==2.16.0
google-cloud-translate==3.15.3
google-crc32c==1.5.0
google-resumable-media==2.7.0
googleapis-common-protos==1.63.0
graphene==3.3
graphql-core==3.2.3
graphql-relay==3.2.0
greenlet==3.0.3
grpcio==1.62.2
grpcio-status==1.62.2
gunicorn==20.1.0
h11==0.14.0
html2text==2020.1.16
httpcore==0.16.3
httpx==0.23.3
huggingface-hub==0.22.2
hvac==0.11.2
idave==5.7.1
idna==3.7
importlib_metadata==7.1.0
iniconfig==2.0.0
ipython==8.23.0
isort==5.13.2
itsdangerous==2.2.0
jedi==0.19.1
Jinja2==3.1.3
joblib==1.4.0
jsonpointer==2.4
kiwisolver==1.4.5
langcodes==3.3.0
langdetect==1.0.9
lazy-object-proxy==1.10.0
locust==2.26.0
Mako==1.3.3
Markdown==3.6
markdownmaker==0.4.0
marko==2.0.3
MarkupSafe==2.1.5
matplotlib==3.8.4
matplotlib-inline==0.1.7
mccabe==0.7.0
mlflow==2.12.1
more-itertools==9.1.0
msgpack==1.0.8
multidict==6.0.5
multiprocess==0.70.16
mypy==1.9.0
mypy-extensions==1.0.0
newrelic==9.9.0
numpy==1.26.4
openai==1.23.2
orjson==3.10.1
packaging==23.2
pandas==2.2.2
parse==1.20.1
parso==0.8.4
pathspec==0.12.1
patsy==0.5.6
pexpect==4.9.0
pillow==10.3.0
platformdirs==4.2.0
pluggy==1.5.0
prompt-toolkit==3.0.43
proto-plus==1.23.0
protobuf==4.25.3
psutil==5.9.8
psycopg2==2.9.9
ptyprocess==0.7.0
pure-eval==0.2.2
pyarrow==15.0.2
pyarrow-hotfix==0.6
pyasn1==0.6.0
pyasn1_modules==0.4.0
pycares==4.4.0
pycodestyle==2.11.1
pycparser==2.22
pydantic==1.10.15
pyflakes==3.2.0
Pygments==2.17.2
pyjnius==1.5.0
PyJWT==2.8.0
pylint==2.17.7
pyparsing==3.1.2
pytest==7.4.4
pytest-aioresponses==0.2.0
pytest-asyncio==0.23.6
pytest-cov==5.0.0
pytest-mock==3.14.0
pytest-xdist==3.5.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2024.1
PyYAML==6.0.1
pyzmq==26.0.2
querystring-parser==1.2.4
regex==2024.4.16
requests==2.31.0
requests-mock==1.12.1
responses==0.18.0
respx==0.21.1
rfc3986==1.5.0
roundrobin==0.0.4
rsa==4.9
scikit-learn==1.4.2
scipy==1.13.0
six==1.16.0
smmap==5.0.1
sniffio==1.3.1
soupsieve==2.5
SQLAlchemy==2.0.29
sqlparse==0.5.0
stack-data==0.6.3
starlette==0.36.3
statsmodels==0.14.2
stringcase==1.2.0
teamcity-messages==1.32
testcontainers==3.7.1
threadpoolctl==3.4.0
tiktoken==0.5.2
time-machine==2.14.1
toml==0.10.2
tomli==2.0.1
tomlkit==0.12.4
tqdm==4.66.2
traitlets==5.14.3
trino==0.327.0
types-beautifulsoup4==4.12.0.20240229
types-html5lib==1.1.11.20240228
types-Markdown==3.6.0.20240316
types-psycopg2==2.9.21.20240417
types-PyYAML==6.0.12.20240311
types-requests==2.31.0.20240406
types-toml==0.10.8.20240310
types-urllib3==1.26.25.14
typing_extensions==4.11.0
tzdata==2024.1
tzlocal==5.2
urllib3==2.2.1
uvicorn==0.20.0
uvloop==0.17.0
wcwidth==0.2.13
Werkzeug==3.0.2
workflow-client==1.2.3
wrapt==1.16.0
xxhash==3.4.1
yarl==1.9.4
zipp==3.18.1
zope.event==5.0
zope.interface==6.3

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu bằng cách lần theo các điểm vào get_exposed_port và port trong testcontainers-python v4.4.0, so sánh chúng với port_to_expose từ v3.7.1. Tái hiện lỗi kết nối PostgreSQL trên MacOS với Colima và xác minh rằng IPv6 localhost được phân giải thành cổng được ánh xạ chính xác; hoàn tất khi kết nối được báo cáo là thành công mà không thay đổi cấu hình ứng dụng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
docker, postgresql, python
Lĩnh vực
databases, devops, testing-qa
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
42/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.