Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Enhancement]: Support different docker context #5837

Open
diegolovison opened this issue Sep 12, 2022 · 24 comments
Open

[Enhancement]: Support different docker context #5837

diegolovison opened this issue Sep 12, 2022 · 24 comments

Comments

@diegolovison
Copy link
Contributor

Module

Core

Proposal

% docker context ls
NAME                  DESCRIPTION                               DOCKER ENDPOINT                                  KUBERNETES ENDPOINT                                           ORCHESTRATOR
default               Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                      https://api.xpto.net:6443 (dlovison)   swarm
desktop-linux                                                   unix:///Users/dlovison/.docker/run/docker.sock                                                                 
my-remote-engine2 *                                             ssh://vagrant@192.168.56.6                                       

When I execute my test

16:25:20,932 ERROR (testng-ExampleJdg4931) [org.testcontainers.dockerclient.DockerClientProviderStrategy] Could not find a valid Docker environment. Please check configuration. Attempted configurations were:
16:25:20,932 ERROR (testng-ExampleJdg4931) [org.testcontainers.dockerclient.DockerClientProviderStrategy]     UnixSocketClientProviderStrategy: failed with exception InvalidConfigurationException (Could not find unix domain socket). Root cause NoSuchFileException (/var/run/docker.sock)
16:25:20,933 ERROR (testng-ExampleJdg4931) [org.testcontainers.dockerclient.DockerClientProviderStrategy] As no valid configuration was found, execution cannot continue

@diegolovison
Copy link
Contributor Author

Require docker-java/docker-java#1946

@eddumelendez
Copy link
Member

@diegolovison I think you are using Colima, right? Check the docs on how to set the env vars.

@t1
Copy link

t1 commented Feb 4, 2023

It would be very nice, if Colima would be detected automatically, just like Docker-Desktop is. I assume this is not a political thing 😘

@skagedal
Copy link

skagedal commented Feb 4, 2023

@t1 I think this assumption is correct. My efforts so far about implementing support for Docker contexts have been well received by the maintainers. I am working on a pull request for docker-java here. Hope to be able to finish it up soon. I am also blogging a bit about my progress, starting here.

@chriskilding
Copy link

Is there any update on this? The relevant PR in docker-java was merged a couple of weeks ago and I think they've done a release 3.3.0 with that change included.

Do we just need a new release of testcontainers-java to pick this change up?

@skagedal
Copy link

Oh cool, I missed that – indeed 3.3.0 seems to include it. And the dependency in testcontainers-java was also bumped. So yeah, I guess that's what we need!

@chriskilding
Copy link

@eddumelendez would you be able to publish a new release? (Alternatively, when does the Testcontainers project have a release scheduled next?)

@piotrwielgolaski-tomtom

I build custom release locally, but it does not work out of box, so anyway some adjustment need to be done to make it work before release

@skagedal
Copy link

@piotrwielgolaski-tomtom Could you provide some details on what you tried and in what you saw?

@piotrwielgolaski-tomtom

@skagedal my scenario was simple, use docker context to connect with remote docker instance.
when I rebuild latest code I wanted to give a try, but it don't work.
it seems that test containers have concept of DockerClientProviderStrategy, but any of existing one will take into account context set by docker, maybe EnvironmentAndSystemPropertyClientProviderStrategy requires same extension or extra strategy need to be added

@piotrwielgolaski-tomtom

I take another swing on this and simple change in EnvironmentAndSystemPropertyClientProviderStrategy https://github.com/piotrwielgolaski-tomtom/testcontainers-java/blob/de1324ed2800eff4da326d0c23d281399d006bc0/core/src/main/java/org/testcontainers/dockerclient/EnvironmentAndSystemPropertyClientProviderStrategy.java#L51

            case "autoIgnoringUserProperties":
                dockerClientConfig = configBuilder.build();
                applicable = dockerClientConfig.getDockerHost() != null;
                break;

make it work a bit more, but you need to opt in for dockerconfig.source=autoIgnoringUserProperties

@skagedal I noticed that you focused on docker host, but all TLS is missing, so when I use remote connection over tcp with tls it will not work. It would be lovely if docker-java also support resolution of getSSLConfig based on context

@skagedal
Copy link

@piotrwielgolaski-tomtom Right, there is a SkipTLSVerify boolean property in the context that also should have been taken into account. I missed/forgot that. When you say "all TLS", do you mean other things as well?

@skagedal
Copy link

Oh, there is a TLSMaterial property... https://docs.docker.com/engine/context/working-with-contexts/

I never found any complete documentation on this format, does anyone know what that might be?

@piotrwielgolaski-tomtom
Copy link

@skagedal The best that I can find https://github.com/docker/cli/blob/a0756c3c2cacebf5e5dc6454cc280c3ddf675176/docs/reference/commandline/context_inspect.md?plain=1#L42
I thin that this path if exist should be used for SSL config, of course if skip is not true.

@skagedal
Copy link

skagedal commented Apr 3, 2023

And what would it expect to find in that path?

@piotrwielgolaski-tomtom
Copy link

And what would it expect to find in that path?

I would expect that whatever docker expects to configure SSL https://github.com/skagedal/docker-java/blob/88cea47d18cce4339a202ae7ad66fe68ee00d533/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultDockerClientConfig.java#LL450C58-L450C72
It should be directory with certificate

@glasser
Copy link

glasser commented Apr 11, 2023

Now that 1.8.0 is out which uses docker-java 3.3, is this supposed to work out of the box? It's not working for me but maybe I'm doing something wrong.

@piotrwielgolaski-tomtom

It does not work out of box, I wrote details above.

@glasser
Copy link

glasser commented Apr 14, 2023

Ah cool — is there a PR open for that last bit? Is that something I can work around as a user without forking testcontainers?

glasser added a commit to glasser/testcontainers-java that referenced this issue Apr 19, 2023
This is related to testcontainers#5837, though I'm not sure if it fully fixes it.

This makes two changes that make testcontainers work with Colima with no
configuration for me:

- Since v3.3 docker-java supports looking in the context file to
  discover the Docker host, but
  EnvironmentAndSystemPropertyClientProviderStrategy ignored that. This
  change makes it so that if `DefaultDockerClientConfig.Builder.build`
  ever returns a non-default docker-host, it is used.
- With Colima, the path that you use to refer to the docker socket when
  setting up container volumes is different from the path you use to
  directly connect to Docker, because within the VM, you just use the
  standard `/var/run/docker.sock`. Add some hardcoded logic to always
  use `/var/run/docker.sock` if the chosen socket appears to be from
  Colima; you can always override with
  $TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE.
@glasser
Copy link

glasser commented Apr 19, 2023

While I don't know if this supports all context use cases, #6927 is sufficient to support Colima without any configuration.

@g0t4
Copy link

g0t4 commented Jun 16, 2023

FYI in the latest build of Docker Desktop for macOS it no longer automatically sets/updates /var/run/docker.sock

  • To re-enable use Settings > Advanced > Allow the default Docker socket to be used (requires password).
  • If /var/run/docker.sock isn't valid then testcontainers fails with:
Could not find a valid Docker environment. Please check configuration. Attempted configurations were: ...
(Could not find unix domain socket). Root cause NoSuchFileException (/var/run/docker.sock)

If testcontainers supported contexts, I could use docker context use desktop-linux which points to a user specific socket: unix:///Users/$USER/.docker/run/docker.sock

@dominik-kovacs
Copy link

what is the current status?

@OscarPalafox
Copy link

In #5039, @kiview and @bsideup both mention it is possible to do it with custom Docker configurations. Would it be possible to please get some guidance on how to achieve this?

@mikiTesf
Copy link

mikiTesf commented Feb 1, 2025

This could be related

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests