Skip to content

Bug: Database fields not escaped when building URL #547

Closed
@LyndonFan

Description

@LyndonFan

Describe the bug

The get_connection_url function for database containers does not escape "%" properly.

I was testing some code at work which connected to a database (MySQL), and noticed it was unable to do so. I found out it was because the password contained a "%" and we created the database url with f-strings like below. This meant the url got screwed up and the connection failed.

f"mysql+pymysql://{username}:{password}@{host}:{port}/{database}

While I have only tested with MySql, from going through the repo, I suspect this could affect most (if not all) database containers, as the same method appears to be used in the library.

To Reproduce

See the simplified version of my test code.

# test_create_user.py
import pytest
from sqlalchemy import create_engine
from testcontainers.mysql import MySqlContainer

mock_secrets = {
    "root_username": "root",
    "root_password": "root%1234",
}

mysql = MySqlContainer(
    "mysql:8.0.27",
    username=mock_secrets["root_username"],
    password=mock_secrets["root_password"],
)

@pytest.fixture(scope="module", autouse=True)
def mysql_container(request):
    mysql.start()
    def cleanup():
        mysql.stop()

    request.addfinalizer(cleanup)
    return mysql

def test_create_user():
    root_url = mysql.get_connection_url() # just need to make sure mysql is used
  • Expected behaviour: sql container spins up, and the test passes
  • Actual behaviour: the test fails at mysql.start(), as it is unable to connect to the container.
Full error logs
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ pytest .
======================================================= test session starts ========================================================
platform darwin -- Python 3.11.2, pytest-8.1.1, pluggy-1.4.0
rootdir: /Users/lyndonf/Desktop/testcontainers-issue
configfile: pyproject.toml
collected 1 item

test_create_user.py E [100%]

====================================================== ERRORS ======================================================
******************\_\_\_\_****************** ERROR at setup of test_create_user ******************\_\_\_\_******************

request = <SubRequest 'mysql_container' for <Function test_create_user>>

    @pytest.fixture(scope="module", autouse=True)
    def mysql_container(request):

>       mysql.start()

test_create_user.py:22:

---

.venv/lib/python3.11/site-packages/testcontainers/core/generic.py:71: in start
self.\_connect()

---

wrapped = <bound method DbContainer.\_connect of <testcontainers.mysql.MySqlContainer object at 0x10d17c350>>
instance = <testcontainers.mysql.MySqlContainer object at 0x10d17c350>, args = (), kwargs = {}

    @wrapt.decorator
    def wrapper(wrapped: Callable, instance: Any, args: list, kwargs: dict) -> Any:
        from testcontainers.core.container import DockerContainer

        if isinstance(instance, DockerContainer):
            logger.info("Waiting for container %s with image %s to be ready ...", instance._container, instance.image)
        else:
            logger.info("Waiting for %s to be ready ...", instance)

        exception = None
        for attempt_no in range(config.max_tries):
            try:
                return wrapped(*args, **kwargs)
            except transient_exceptions as e:
                logger.debug(
                    f"Connection attempt '{attempt_no + 1}' of '{config.max_tries + 1}' "
                    f"failed: {traceback.format_exc()}"
                )
                time.sleep(config.sleep_time)
                exception = e

>       raise TimeoutError(

            f"Wait time ({config.timeout}s) exceeded for {wrapped.__name__}(args: {args}, kwargs: "
            f"{kwargs}). Exception: {exception}"
        )

E TimeoutError: Wait time (120s) exceeded for \_connect(args: (), kwargs: {}). Exception: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'172.17.0.1' (using password: YES)")
E (Background on this error at: https://sqlalche.me/e/20/e3q8)

.venv/lib/python3.11/site-packages/testcontainers/core/waiting_utils.py:67: TimeoutError
---------------------------------------------- Captured stderr setup -----------------------------------------------
Pulling image testcontainers/ryuk:0.7.0
Container started: b8f4d57ee296
Waiting for container <Container: b8f4d57ee296> with image testcontainers/ryuk:0.7.0 to be ready ...
Pulling image mysql:8.0.27
Container started: b91add5dbff1
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
------------------------------------------------ Captured log setup ------------------------------------------------
INFO testcontainers.core.container:container.py:77 Pulling image testcontainers/ryuk:0.7.0
INFO testcontainers.core.container:container.py:89 Container started: b8f4d57ee296
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b8f4d57ee296> with image testcontainers/ryuk:0.7.0 to be ready ...
INFO testcontainers.core.container:container.py:77 Pulling image mysql:8.0.27
INFO testcontainers.core.container:container.py:89 Container started: b91add5dbff1
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
INFO testcontainers.core.waiting_utils:waiting_utils.py:52 Waiting for container <Container: b91add5dbff1> with image mysql:8.0.27 to be ready ...
============================================= short test summary info ==============================================
ERROR test_create_user.py::test_create_user - TimeoutError: Wait time (120s) exceeded for \_connect(args: (), kwargs: {}). Exception: (pymysql.err.Operational...
=========================================== 1 error in 127.60s (0:02:07) ===========================================

Suggestions

  • use urllib.parse.quote to preprocess fields before putting them into the url
  • use URL from sqlalchemy to generate the url, though from previous history this option does not seem to be recommended

Runtime environment

  • Operating System: Darwin MacBook-Pro-9 22.3.0
  • Python version: 3.11.2
  • Docker Version: Docker version 20.10.17, build 100c701
  • testcontainers version: 4.3.3
Full environment details
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ uname -a
Darwin MacBook-Pro-9 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan 30 20:42:11 PST 2023; root:xnu-8792.81.3~2/RELEASE_X86_64 x86_64
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ python --version
Python 3.11.2
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ docker --version
Docker version 20.10.17, build 100c701
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc., v0.9.1)
  compose: Docker Compose (Docker Inc., v2.10.2)
  extension: Manages Docker extensions (Docker Inc., v0.2.9)
  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
  scan: Docker Scan (Docker Inc., v0.19.0)

Server:
 Containers: 4
  Running: 3
  Paused: 0
  Stopped: 1
 Images: 11
 Server Version: 20.10.17
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  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: runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
  cgroupns
 Kernel Version: 5.10.124-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 3.842GiB
 Name: docker-desktop
 ID: AP6V:IK5D:CB2F:AUKG:RNID:EJ5Y:L4PD:2BR6:FR57:7FH2:SHCA:2AZB
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5000
  127.0.0.0/8
 Live Restore Enabled: false

(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$ pip freeze
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
cryptography==42.0.5
docker==7.0.0
greenlet==3.0.3
idna==3.7
iniconfig==2.0.0
packaging==24.0
pluggy==1.4.0
pycparser==2.22
PyMySQL==1.1.0
pytest==8.1.1
requests==2.31.0
ruff==0.3.7
SQLAlchemy==2.0.29
testcontainers==4.3.3
typing_extensions==4.11.0
urllib3==2.2.1
wrapt==1.16.0
(testcontainers-issue-py3.11) MacBook-Pro-9:testcontainers-issue lyndonf$

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions