Repository navigation
Closed
Description
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.quoteto preprocess fields before putting them into the url - use
URLfromsqlalchemyto 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
Labels
No labels
Activity
max-pfeiffer commentedon Apr 17, 2024
@LyndonFan I just wrote a test and tried to reproduce your issue: and yes it fails also on my machine, but not because of an character escaping problem. It fails because the mysql:8.0.27 Docker image does not support ARM CPUs.
When I run the same test with mysql:8.3.0 image, test is green.
Please check the images on Docker Hub:
Are you working on an M1, M2 or M3 MacBook? Then most likely that is the root cause of your problem.
LyndonFan commentedon Apr 17, 2024
None of the above -- it's "2.3 GHz Quad-Core Intel Core i7"
alexanderankin commentedon Apr 17, 2024
using
urllib.parse.quotemakes sense to me, sounds like a mergeable pull request if we had one that did that 👍max-pfeiffer commentedon Apr 17, 2024
@LyndonFan I just ran your sample code with mysql:8.3.0, test is green. Cannot reproduce.
testcontainers-python=4.4.0
alexanderankin commentedon Apr 17, 2024
hmm, yeah it doesn't reproduce for me either:works with %12:produces:
LyndonFan commentedon Apr 17, 2024
Thanks for the quick responses!
I've updated testcontainers to 4.4.0, and updated my test to be based on David's. Note I changed the password to contain "%12", which is the same as
urllib.parse.quote('\x12'), and I think that leads to the issue.Running
python test.py, I now get access denied:(1045, "Access denied for user 'test'@'172.17.0.1' (using password: YES)")Full error logs (8-oracle)
I modified the image to be
mysql:8.3.0instead ofmysql:8-oracleand re-ran the test, but still got a similar error.Full error logs (for 8.3.0)
Let me know if the above results help. I'm happy to work on a merge request to close this.
alexanderankin commentedon Apr 18, 2024
yep, reproduces with %12 in the password, im editing my previous comment
alexanderankin commentedon Apr 18, 2024
@LyndonFan just re-read your last comment and yeah if you want to open a PR that would be great! not sure when ill get to it but appreciate the offer and as above, a PR is welcome. we'd probably want to either add tests for postgres, sql server, oracle, etc as well or make this behavior opt-in or something.
fix: url quote passwords (#549)