Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat(core): Add run_containers function in utils.py to run several containers#896

Open
surister wants to merge 1 commit into
testcontainers:main from
surister:feat/run_many_containers
Open

feat(core): Add run_containers function in utils.py to run several containers #896
surister wants to merge 1 commit into
testcontainers:main from
surister:feat/run_many_containers

Conversation

@surister

@surister surister commented Oct 5, 2025
edited
Loading

Copy link
Copy Markdown
Contributor

This utils method runs containers on the same context manager. This ensures that the passed containers are run in order and cleaned up.

The main use case is to be able to run code after all containers have started. I need this to create CrateDB clusters.

Practical example: run containers inside a network and clean up the network (network can only be cleaned up after all containers using it are stopped)

network = Network()
network.create()
with run_containers(
 PostgresContainer(network=network),
 PostgresContainer(image='postgres:16', network=network),
) as containers:
 c1, c2 = containers
 conn1 = sqlalchemy.engine.create_engine(c1.get_connection_url()).connect()
 conn2 = sqlalchemy.engine.create_engine(c2.get_connection_url()).connect()
 result1 = conn1.execute(sqlalchemy.text("select version()")).fetchone()
 result2 = conn2.execute(sqlalchemy.text("select version()")).fetchone()
 print(result1, result2, sep='\n')
# The network gets removed only when containers are stopped.
network.remove()

Copy link
Copy Markdown
Member

if we add this can we name it consistently with any one of the other implementations, thanks

surister commented Oct 8, 2025
edited
Loading

Copy link
Copy Markdown
Contributor Author

if we add this can we name it consistently with any one of the other implementations, thanks

Hm, could you like any of the other implementations? Can't find them @alexanderankin

Copy link
Copy Markdown
Contributor

I'm admittedly not sure this should be part of the library, when the caller can achieve the same result explicitly with the same amount of code.

with run_containers(
 PostgresContainer(network=network),
 PostgresContainer(image='postgres:16', network=network),
) as containers:
 c1, c2 = containers

Becomes

with contextlib.ExitStack() as stack:
 c1, c2 = stack.enter_context(container) for container in (
 PostgresContainer(network=network),
 PostgresContainer(image='postgres:16', network=network)
 )

alexanderankin commented Oct 15, 2025 via email

Copy link
Copy Markdown
Member
...
On Mon, Oct 13, 2025 at 5:23 PM Ryan Hoban ***@***.***> wrote: *rhoban13* left a comment (testcontainers/testcontainers-python#896) <#896 (comment)> I'm admittedly not sure this should be part of the library, when the caller can achieve the same result explicitly with the same amount of code. with run_containers( PostgresContainer(network=network), PostgresContainer(image='postgres:16', network=network), ) as containers: c1, c2 = containers Becomes with contextlib.ExitStack() as stack: c1, c2 = stack.enter_context(container) for container in ( PostgresContainer(network=network), PostgresContainer(image='postgres:16', network=network) ) — Reply to this email directly, view it on GitHub <#896 (comment)>, or unsubscribe <https://github.com/notifications/unsubscribe-auth/ACECGJEPB3G3BZVLOQQEFKT3XQJ3PAVCNFSM6AAAAACIKPW4UOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTGOJZGEYDQNZSGE> . You are receiving this because you were mentioned.Message ID: ***@***.***>

alexanderankin commented Oct 15, 2025 via email

Copy link
Copy Markdown
Member
...
On Tue, Oct 14, 2025 at 8:23 PM David Ankin ***@***.***> wrote: https://www.javadoc.io/doc/org.testcontainers/testcontainers/1.12.1/org/testcontainers/lifecycle/Startables.html On Mon, Oct 13, 2025 at 5:23 PM Ryan Hoban ***@***.***> wrote: > *rhoban13* left a comment (testcontainers/testcontainers-python#896) > <#896 (comment)> > > I'm admittedly not sure this should be part of the library, when the > caller can achieve the same result explicitly with the same amount of code. > > with run_containers( > PostgresContainer(network=network), > PostgresContainer(image='postgres:16', network=network), > ) as containers: > c1, c2 = containers > > Becomes > > with contextlib.ExitStack() as stack: > c1, c2 = stack.enter_context(container) for container in ( > PostgresContainer(network=network), > PostgresContainer(image='postgres:16', network=network) > ) > > — > Reply to this email directly, view it on GitHub > <#896 (comment)>, > or unsubscribe > <https://github.com/notifications/unsubscribe-auth/ACECGJEPB3G3BZVLOQQEFKT3XQJ3PAVCNFSM6AAAAACIKPW4UOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZTGOJZGEYDQNZSGE> > . > You are receiving this because you were mentioned.Message ID: > ***@***.***> >

Copy link
Copy Markdown
Contributor

Ahhhh, I see what you're looking to achieve. I could definitely see the parallel container startup being a really useful feature. In it's current form, that's not what this PR proposes.

I suspect such an implementation and would warrant some discussion on which of python's plethora of ways to achieve parallelism makes most sense here.

alexanderankin reacted with thumbs up emoji

@Tranquility2 Tranquility2 added 🛠️ needs more work Need to invest more time, can be a rebase or code updates ✨ feat labels Apr 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Assignees

No one assigned

Labels

✨ feat 🛠️ needs more work Need to invest more time, can be a rebase or code updates

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /