testcontainers / testcontainers/testcontainers-java

[Enhancement]: Being able to use Ryuk in (CI) environment where Docker "userns-remap" mode is active

Ouverte
#7,964 10 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

type/enhancement
Langage dominant
Java
Étoiles
8.7k
Forks
1.9k
Merge moyen
2 j 17 h
PR mergées (30 j)
9

Description

Module

Core

Proposal

Hello,

I'm using Testcontainers in an on-prem GitLab CI environment, where the GitLab runner hosts have their Docker server with userns-remap turned on.
I ran into a couple of issues related to Ryuk in this case.
First, from what I read on https://java.testcontainers.org/features/configuration/#customizing-ryuk-resource-reaper, the Ryuk container must be started as a privileged container.
That's the reason why I get the following error when Testcontainers tried launching the Ryuk container:

...
com.github.dockerjava.api.exception.BadRequestException: Status 400: {"message":"privileged mode is incompatible with user namespaces.  You must run the container in the host namespace when running privileged mode"}
...

As a quick hack, I worked around this issue by "monkeypatching" org.testcontainers.utility.RyukContainer and adding:

    cmd
        .getHostConfig()
        ...
        .withUsernsMode("host")  /// <= added

The Ruyk container could then start fine.

But due to the fact the GitLab runner container conforms to this userns-remap mode (and thus not Ruyk as per the above), Testcontainers was not able to connect to Ryuk:

...
WARN --- [containers-ryuk] o.t.utility.RyukResourceReaper : Can not connect to Ryuk at 172.17.0.1:35592

Again, I had to resort to monkeypatching org.testcontainers.utility.RuykResourceReaper to have:

...
// String host = ryukContainer.getHost();
String host = ryukContainer.getCurrentContainerInfo().getNetworkSettings().getIpAddress();
// Integer ryukPort = ryukContainer.getFirstMappedPort();
Integer ryukPort = ryukContainer.getExposedPorts().get(0);
...

My understanding is that this fix is obviously not portable in environments where the Docker host is not local to where Testcontainers is running.
But bar changing my CI environment setup to drop the userns-remap mode, I don't see any other solution to my issue.

What do you think of having "official support" for such a workaround in Testcontainers, so I don't have to monkeypatch Java classes... 🤓
If not via a setting (e.g. ryuk.container.userns_mode=host or something related), maybe via a way to customize the behavior of Testcontainers dynamically?

Thanks!

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Examinez org.testcontainers.utility.RyukContainer et RyukResourceReaper, ainsi que la documentation relative à la configuration personnalisée de Ryuk. Suivez la manière dont l’espace de noms de l’hôte du conteneur et l’adresse de connexion sont sélectionnés, puis déterminez comment une option officielle pourrait prendre en charge Docker userns-remap sans perturber les environnements Docker distants. La réalisation doit inclure des tests couvrant la configuration prise en charge et le comportement de connexion.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
docker, java
Domaine
devops, testing
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.