Add network option for image building

This commit adds configuration to the Maven and Gradle plugins to
allow specifying the network mode to be provided to the image
building goal and task.

See gh-27486
This commit is contained in:
Jeroen Meijer
2021-07-24 15:47:01 +02:00
committed by Scott Frederick
parent e737388f5c
commit 8e6d03b221
17 changed files with 195 additions and 15 deletions

View File

@@ -45,6 +45,7 @@ import static org.assertj.core.api.Assertions.entry;
*
* @author Phillip Webb
* @author Scott Frederick
* @author Jeroen Meijer
*/
public class BuildRequestTests {
@@ -199,6 +200,12 @@ public class BuildRequestTests {
.withMessage("Bindings must not be null");
}
@Test
void withNetworkUpdatesNetwork() throws IOException {
BuildRequest request = BuildRequest.forJarFile(writeTestJarFile("my-app-0.0.1.jar")).withNetwork("test");
assertThat(request.getNetwork()).isEqualTo("test");
}
private void hasExpectedJarContent(TarArchive archive) {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

View File

@@ -62,6 +62,7 @@ import static org.mockito.Mockito.verify;
*
* @author Phillip Webb
* @author Scott Frederick
* @author Jeroen Meijer
*/
class LifecycleTests {
@@ -188,6 +189,17 @@ class LifecycleTests {
verify(this.docker.volume()).delete(VolumeName.of("pack-app-aaaaaaaaaa"), true);
}
@Test
void executeWithNetworkExecutesPhases() throws Exception {
given(this.docker.container().create(any())).willAnswer(answerWithGeneratedContainerId());
given(this.docker.container().create(any(), any())).willAnswer(answerWithGeneratedContainerId());
given(this.docker.container().wait(any())).willReturn(ContainerStatus.of(0, null));
BuildRequest request = getTestRequest().withNetwork("test");
createLifecycle(request).execute();
assertPhaseWasRun("creator", withExpectedConfig("lifecycle-creator-network.json"));
assertThat(this.out.toString()).contains("Successfully built image 'docker.io/library/my-application:latest'");
}
private DockerApi mockDockerApi() {
DockerApi docker = mock(DockerApi.class);
ImageApi imageApi = mock(ImageApi.class);

View File

@@ -32,6 +32,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
*
* @author Phillip Webb
* @author Scott Frederick
* @author Jeroen Meijer
*/
class PhaseTests {
@@ -56,6 +57,7 @@ class PhaseTests {
phase.apply(update);
verify(update).withCommand("/cnb/lifecycle/test", NO_ARGS);
verify(update).withLabel("author", "spring-boot");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -69,6 +71,7 @@ class PhaseTests {
verify(update).withBinding(Binding.from("/var/run/docker.sock", "/var/run/docker.sock"));
verify(update).withCommand("/cnb/lifecycle/test", NO_ARGS);
verify(update).withLabel("author", "spring-boot");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -80,6 +83,7 @@ class PhaseTests {
phase.apply(update);
verify(update).withCommand("/cnb/lifecycle/test", "-log-level", "debug");
verify(update).withLabel("author", "spring-boot");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -91,6 +95,7 @@ class PhaseTests {
phase.apply(update);
verify(update).withCommand("/cnb/lifecycle/test");
verify(update).withLabel("author", "spring-boot");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -102,6 +107,7 @@ class PhaseTests {
phase.apply(update);
verify(update).withCommand("/cnb/lifecycle/test", "a", "b", "c");
verify(update).withLabel("author", "spring-boot");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -115,6 +121,7 @@ class PhaseTests {
verify(update).withCommand("/cnb/lifecycle/test");
verify(update).withLabel("author", "spring-boot");
verify(update).withBinding(Binding.from(volumeName, "/test"));
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@@ -129,6 +136,19 @@ class PhaseTests {
verify(update).withLabel("author", "spring-boot");
verify(update).withEnv("name1", "value1");
verify(update).withEnv("name2", "value2");
verify(update).withNetworkMode(null);
verifyNoMoreInteractions(update);
}
@Test
void applyWhenWithNetworkModeUpdatesConfigurationWithNetworkMode() {
Phase phase = new Phase("test", true);
phase.withNetworkMode("test");
Update update = mock(Update.class);
phase.apply(update);
verify(update).withCommand("/cnb/lifecycle/test");
verify(update).withNetworkMode("test");
verify(update).withLabel("author", "spring-boot");
verifyNoMoreInteractions(update);
}

View File

@@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
*
* @author Phillip Webb
* @author Scott Frederick
* @author Jeroen Meijer
*/
class ContainerConfigTests extends AbstractJsonTests {
@@ -59,6 +60,7 @@ class ContainerConfigTests extends AbstractJsonTests {
update.withBinding(Binding.from("bind-source", "bind-dest"));
update.withEnv("name1", "value1");
update.withEnv("name2", "value2");
update.withNetworkMode("test");
});
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
containerConfig.writeTo(outputStream);

View File

@@ -0,0 +1,13 @@
{
"User" : "root",
"Image" : "pack.local/ephemeral-builder",
"Cmd" : [ "/cnb/lifecycle/creator", "-app", "/workspace", "-platform", "/platform", "-run-image", "docker.io/cloudfoundry/run:latest", "-layers", "/layers", "-cache-dir", "/cache", "-launch-cache", "/launch-cache", "-daemon", "-process-type=web", "docker.io/library/my-application:latest" ],
"Env" : [ "CNB_PLATFORM_API=0.4" ],
"Labels" : {
"author" : "spring-boot"
},
"HostConfig" : {
"NetworkMode" : "test",
"Binds" : [ "/var/run/docker.sock:/var/run/docker.sock", "pack-layers-aaaaaaaaaa:/layers", "pack-app-aaaaaaaaaa:/workspace", "pack-cache-b35197ac41ea.build:/cache", "pack-cache-b35197ac41ea.launch:/launch-cache" ]
}
}

View File

@@ -16,6 +16,7 @@
"HostConfig": {
"Binds": [
"bind-source:bind-dest"
]
],
"NetworkMode": "test"
}
}