testcontainers / testcontainers-node

Testcontainers is a NodeJS library that supports tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
https://testcontainers.com
MIT License
1.92k stars 191 forks source link

Lambda container not being removed automatically #848

Open ksiczek opened 2 weeks ago

ksiczek commented 2 weeks ago

Hi there!

I was doing some testing with Testcontainers and LocalStack. I created a container as the docs say, but it turned out that when I stopped it, the lambda container was left started. I found a similar issue in the Java implementation so I tried porting it to my Node solution, ending up with something like:

before(async () => {
    const resourceReaper = await getContainerRuntimeClient().then(crc => getReaper(crc))
    container = await new LocalstackContainer('localstack/localstack:latest')
        .withEnvironment(
            {
                SERVICES: 's3,lambda',
                EAGER_SERVICE_LOADING: '1'
            }
        )
        // below is needed so the lambda service could create a docker image for itself
        .withBindMounts([{
            source: "/var/run/docker.sock",
            target: "/var/run/docker.sock"
        }])
        .withEnvironment(
            {
                /**
                 * Localstack lambda spins a new Docker container up but the container is not removed by
                 * Testcontainers resource reaper unless we pass a label indicating the session id. 
                 */
                LAMBDA_DOCKER_FLAGS: `-l org.testcontainers.session-id=${resourceReaper.sessionId}`
            }
        )
        .start();

[...]
})

Can you make this out-of-the-box solution, please? I found those orphan containers only because I started having issues with resources and it seems the LocalStack has no way to integrate with the resource reaper. If not, then maybe you could mention this in the docs? WDYT?

cristianrgreco commented 2 weeks ago

Hi, I'm not entirely sure what's the problem here. The LocalStack container is automatically cleaned up by the resource reaper like all other containers, there is no exception for it. The LocalStack container is tested in this repo's CICD pipelines and it terminates without issue. Perhaps you could provide some repro.

ksiczek commented 2 weeks ago

The problem is that the LocalStack lambda service creates a separate container (from the public.ecr.aws/lambda/nodejs:20 image) from the main one and the additional container is not cleaned up when Testcontainers shuts down. I can provide an example, I just thought the testcontainers-java issue would be enough since the issue seemed language-agnostic to me.

I'm not sure what kind of tests you mean, or whether you start lambdas there, but you might not notice any dangling containers if you start with a clean Docker each time.

Anyway, I read your response that my request might be unclear and I'll try to refine it.

cristianrgreco commented 2 weeks ago

Oh I see, the LocalStackContainer creates additional containers, OK.

Would you be able to raise a PR to add LAMBDA_DOCKER_FLAGS: -l org.testcontainers.session-id=${resourceReaper.sessionId} as an env var to the LocalStackContainer, and add a test which uses lambda and ensure the containers are cleared up?

eddumelendez commented 2 days ago

This PR from Testcontainers for Java can help.