Use Docker CLI context to determine daemon host address for image building

Configuration files managed by the Docker CLI are now used to determine
the host address of the Docker daemon used when building images using
buildpacks when a host address is not configured with environment
variables or build tool plugin configuration.

Closes gh-36445
This commit is contained in:
Scott Frederick
2023-07-13 14:27:14 -06:00
parent 283dc37db3
commit 4393a2244c
26 changed files with 660 additions and 86 deletions

View File

@@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerConfiguration;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerHost;
import org.springframework.boot.buildpack.platform.docker.configuration.DockerConfiguration.DockerHostConfiguration;
import org.springframework.boot.gradle.junit.GradleProjectBuilder;
import static org.assertj.core.api.Assertions.assertThat;
@@ -68,10 +68,11 @@ class DockerSpecTests {
this.dockerSpec.getTlsVerify().set(true);
this.dockerSpec.getCertPath().set("/tmp/ca-cert");
DockerConfiguration dockerConfiguration = this.dockerSpec.asDockerConfiguration();
DockerHost host = dockerConfiguration.getHost();
DockerHostConfiguration host = dockerConfiguration.getHost();
assertThat(host.getAddress()).isEqualTo("docker.example.com");
assertThat(host.isSecure()).isTrue();
assertThat(host.getCertificatePath()).isEqualTo("/tmp/ca-cert");
assertThat(host.getContext()).isNull();
assertThat(dockerConfiguration.isBindHostToBuilder()).isFalse();
assertThat(this.dockerSpec.asDockerConfiguration().getBuilderRegistryAuthentication()).isNull();
assertThat(decoded(dockerConfiguration.getPublishRegistryAuthentication().getAuthHeader()))
@@ -85,10 +86,29 @@ class DockerSpecTests {
void asDockerConfigurationWithHostConfigurationNoTlsVerify() {
this.dockerSpec.getHost().set("docker.example.com");
DockerConfiguration dockerConfiguration = this.dockerSpec.asDockerConfiguration();
DockerHost host = dockerConfiguration.getHost();
DockerHostConfiguration host = dockerConfiguration.getHost();
assertThat(host.getAddress()).isEqualTo("docker.example.com");
assertThat(host.isSecure()).isFalse();
assertThat(host.getCertificatePath()).isNull();
assertThat(host.getContext()).isNull();
assertThat(dockerConfiguration.isBindHostToBuilder()).isFalse();
assertThat(this.dockerSpec.asDockerConfiguration().getBuilderRegistryAuthentication()).isNull();
assertThat(decoded(dockerConfiguration.getPublishRegistryAuthentication().getAuthHeader()))
.contains("\"username\" : \"\"")
.contains("\"password\" : \"\"")
.contains("\"email\" : \"\"")
.contains("\"serveraddress\" : \"\"");
}
@Test
void asDockerConfigurationWithContextConfiguration() {
this.dockerSpec.getContext().set("test-context");
DockerConfiguration dockerConfiguration = this.dockerSpec.asDockerConfiguration();
DockerHostConfiguration host = dockerConfiguration.getHost();
assertThat(host.getContext()).isEqualTo("test-context");
assertThat(host.getAddress()).isNull();
assertThat(host.isSecure()).isFalse();
assertThat(host.getCertificatePath()).isNull();
assertThat(dockerConfiguration.isBindHostToBuilder()).isFalse();
assertThat(this.dockerSpec.asDockerConfiguration().getBuilderRegistryAuthentication()).isNull();
assertThat(decoded(dockerConfiguration.getPublishRegistryAuthentication().getAuthHeader()))
@@ -98,12 +118,20 @@ class DockerSpecTests {
.contains("\"serveraddress\" : \"\"");
}
@Test
void asDockerConfigurationWithHostAndContextFails() {
this.dockerSpec.getContext().set("test-context");
this.dockerSpec.getHost().set("docker.example.com");
assertThatExceptionOfType(GradleException.class).isThrownBy(this.dockerSpec::asDockerConfiguration)
.withMessageContaining("Invalid Docker configuration");
}
@Test
void asDockerConfigurationWithBindHostToBuilder() {
this.dockerSpec.getHost().set("docker.example.com");
this.dockerSpec.getBindHostToBuilder().set(true);
DockerConfiguration dockerConfiguration = this.dockerSpec.asDockerConfiguration();
DockerHost host = dockerConfiguration.getHost();
DockerHostConfiguration host = dockerConfiguration.getHost();
assertThat(host.getAddress()).isEqualTo("docker.example.com");
assertThat(host.isSecure()).isFalse();
assertThat(host.getCertificatePath()).isNull();