testcontainers / testcontainers/testcontainers-java

[Bug]: Testcontainers ignores Docker proxies settings

Aperta
#5,981 1 commento 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

type/bug
Lingua principale
Java
Stelle
8.7k
Fork
1.9k
Merge medio
2g 17h
PR unite (30g)
9

Descrizione

Module

Core

Testcontainers version

1.17.5

Using the latest Testcontainers version?

Yes

Host OS

Linux

Host Arch

x86_64

Docker version
Client: Docker Engine - Community
 Version:           20.10.9
 API version:       1.41
 Go version:        go1.16.8
 Git commit:        c2ea9bc
 Built:             Mon Oct  4 16:08:29 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.9
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.8
  Git commit:       79ea9d3
  Built:            Mon Oct  4 16:06:37 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.11
  GitCommit:        5b46e404f6b9f661a205e28d59c982d3634148f8
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
What happened?

It seems that Testcontainers doesn't load HTTPS_PROXY and HTTP_PROXY environment variables inside the container build process whereas Docker successfully include those variables when it builds images itself.

I have an authenticated enterprise proxy which I set up on my local machine using the ~/.docker/config.json file

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://myproxyuser:myproxypassword@proxy.example.com:3128",
     "httpsProxy": "http://myproxyuser:myproxypassword@proxy.example.com:3128",
     "noProxy": "localhost,127.0.0.1,docker-registry.example.com,.corp"
   }
 }
}

as well as using a /etc/systemd/system/docker.service.d/http-proxy.conf file which looks like

[Service]
Environment="HTTP_PROXY=http://myproxyuser:myproxypassword@proxy.example.com:3128"
Environment="HTTPS_PROXY=http://myproxyuser:myproxypassword@proxy.example.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

I developed the following project to illustrate my problem : when I run ./build-using-docker.sh https://proxy.example.com/proxy.crt it launches a ./mvnw --settings /home/myuser/.m2/settings.proxy.xml clean package command inside a Docker container run like this docker run -it --rm -u 1000:998 -v /home/myuser/myprojects/testcontainers-proxy-issue:/home/myuser/myprojects/testcontainers-proxy-issue -w /home/myuser/myprojects/testcontainers-proxy-issue -v /home/myuser/.m2:/home/myuser/.m2 -v /var/run/docker.sock:/var/run/docker.sock -e 'MAVEN_OPTS=-Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=3128 -Dhttps.proxyUser=myproxyuser -Dhttps.proxyPassword=myproxypassword -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=3128 -Dhttp.proxyUser=myproxyuser -Dhttp.proxyPassword=myproxypassword -Djavax.net.ssl.trustStore=./proxy-data/cacerts -Duser.home=/home/myuser' -v /home/myuser/.docker/config.json:/home/myuser/.docker/config.json -e DOCKER_CONFIG=/home/myuser/.docker eclipse-temurin:17-jdk-alpine sh -cex 'cp /opt/java/openjdk/lib/security/cacerts ./proxy-data/ && keytool -importcert -alias proxy.crt -file ./proxy-data/proxy.crt -trustcacerts -keystore ./proxy-data/cacerts -storepass changeit -noprompt; ./mvnw --settings /home/myuser/.m2/settings.proxy.xml clean package'.

Then Maven launches the tests of the projects which executes findAllTest() test which launches @ExtendWith(OpenldapTestContainerIntegrationTestExtension.class) before, which executes the following code:

        final var imageFromDockerfile = new ImageFromDockerfile()
                .withFileFromPath(".", Path.of("src", "main", "docker"));

The targetted Dockerfile only contains this:

FROM bitnami/openldap:2.6

RUN test -n "$HTTPS_PROXY" || exit 42

Here is the JUnit failing log:

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.959 s <<< FAILURE! - in com.github.anthony_o.testcontainers_proxy_issue.repository.UserRepositoryIntegrationTest
[ERROR] com.github.anthony_o.testcontainers_proxy_issue.repository.UserRepositoryIntegrationTest  Time elapsed: 1.957 s  <<< ERROR!
org.testcontainers.containers.ContainerLaunchException: Container startup failed
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=<resolving>, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@4a0df195)
Caused by: com.github.dockerjava.api.exception.DockerClientException: Could not build image: The command '/bin/bash -o pipefail -c test -n "$HTTPS_PROXY" || exit 42' returned a non-zero code: 42

Whereas if I simply run the following Docker command, it succeed:

docker build src/main/docker/ -t testcontainers-proxy-issue --no-cache
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM bitnami/openldap:2.6
 ---> eb7e0974d701
Step 2/2 : RUN test -n "$HTTPS_PROXY" || exit 42
 ---> Running in e298e31d18f4
Removing intermediate container e298e31d18f4
 ---> 5a87cf389f41
Successfully built 5a87cf389f41
Successfully tagged testcontainers-proxy-issue:latest
Relevant log output

No response

Additional Information

No response

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con la riproduzione collegata, in particolare OpenldapTestContainerIntegrationTestExtension.java, UserRepositoryIntegrationTest.java e il relativo Dockerfile. Esegui findAllTest() e confronta la build di ImageFromDockerfile con la docker build diretta mostrata nel report. Il lavoro è completato quando il controllo HTTPS_PROXY del Dockerfile ha esito positivo durante la build dell’immagine tramite Testcontainers e il test passa.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
docker, java
Ambito
devops, testing
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.