Authentication with Docker¶
Sometimes the Docker images you use live in a private Docker registry. For that reason, Testcontainers for Go gives you the ability to read the Docker configuration and retrieve the authentication for a given registry. To achieve it, Testcontainers for Go will internally check, in this particular order:
- the
DOCKER_AUTH_CONFIG
environment variable, unmarshalling the string value from its JSON representation and using it as the Docker config. - the
DOCKER_CONFIG
environment variable, as an alternative path to the Docker config file. - else it will load the default Docker config file, which lives in the user's home, e.g.
~/.docker/config.json
- it will use the right Docker credential helper to retrieve the authentication (user, password and base64 representation) for the given registry.
To understand how the Docker credential helpers work, please refer to the official documentation.
Info
Testcontainers for Go uses https://github.com/cpuguy83/dockercfg to retrieve the authentication from the credential helpers.
Testcontainers for Go will automatically discover the credentials for a given Docker image from the Docker config, as described above. For that, it will extract the Docker registry from the image name, and for that registry will try to locate the authentication in the Docker config, returning an empty string if the registry is not found. As a consequence, all the fields to pass credentials to the container request will be deprecated.
req := ContainerRequest{
Image: "myregistry.com/myimage:latest",
}
In the case you are building an image from the Dockerfile, the authentication will be automatically retrieved from the Docker config, so you don't need to pass it explicitly:
ba := "build args value"
req := ContainerRequest{
FromDockerfile: FromDockerfile{
Context: filepath.Join(".", "testdata"),
Dockerfile: "args.Dockerfile",
BuildArgs: map[string]*string{
"FOO": &ba,
},
},
ExposedPorts: []string{"8080/tcp"},
WaitingFor: wait.ForLog("ready"),
}
⋯
req := ContainerRequest{
FromDockerfile: FromDockerfile{
Context: filepath.Join(".", "testdata"),
Dockerfile: "buildlog.Dockerfile",
PrintBuildLog: true,
},
}
⋯
req := ContainerRequest{
FromDockerfile: FromDockerfile{
Context: filepath.Join(".", "testdata"),
Dockerfile: "buildlog.Dockerfile",
BuildLogWriter: &buffer,
},
}