package org.testcontainers.junit; import com.github.dockerjava.api.command.BuildImageCmd; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.WaitingConsumer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import org.testcontainers.images.builder.ImageFromDockerfile; import org.testcontainers.images.builder.Transferable; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import static org.rnorth.visibleassertions.VisibleAssertions.pass; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; public class DockerfileTest { private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileTest.class); @Test public void simpleDockerfileWorks() { ImageFromDockerfile image = new ImageFromDockerfile() .withFileFromString("folder/someFile.txt", "hello") .withFileFromClasspath("test.txt", "mappable-resource/test-resource.txt") .withFileFromClasspath("Dockerfile", "mappable-dockerfile/Dockerfile"); verifyImage(image); } @Test public void customizableImage() { ImageFromDockerfile image = new ImageFromDockerfile() { @Override protected void configure(BuildImageCmd buildImageCmd) { super.configure(buildImageCmd); List<String> dockerfile = Arrays.asList( "FROM alpine:3.2", "RUN echo 'hello from Docker build process'", "CMD yes" ); withFileFromString("Dockerfile", String.join("\n", dockerfile)); buildImageCmd.withNoCache(true); } }; verifyImage(image); } @Test public void dockerfileBuilderWorks() { ImageFromDockerfile image = new ImageFromDockerfile() .withFileFromClasspath("test.txt", "mappable-resource/test-resource.txt") .withFileFromString("folder/someFile.txt", "hello") .withDockerfileFromBuilder(builder -> builder .from("alpine:3.2") .workDir("/app") .add("test.txt", "test file.txt") .run("ls", "-la", "/app/test file.txt") .copy("folder/someFile.txt", "/someFile.txt") .expose(80, 8080) .cmd("while true; do cat /someFile.txt | nc -l -p 80; done") ); verifyImage(image); } @Test public void filePermissions() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); ImageFromDockerfile image = new ImageFromDockerfile() .withFileFromTransferable("/someFile.txt", new Transferable() { @Override public long getSize() { return 0; } @Override public byte[] getBytes() { return new byte[0]; } @Override public String getDescription() { return "test file"; } @Override public int getFileMode() { return 0123; } }) .withDockerfileFromBuilder(builder -> builder .from("alpine:3.2") .copy("someFile.txt", "/someFile.txt") .cmd("stat -c \"%a\" /someFile.txt") ); GenericContainer container = new GenericContainer(image) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withLogConsumer(consumer); try { container.start(); consumer.waitUntil(frame -> frame.getType() == STDOUT && frame.getUtf8String().contains("123"), 5, TimeUnit.SECONDS); } finally { container.stop(); } } protected void verifyImage(ImageFromDockerfile image) { GenericContainer container = new GenericContainer(image); try { container.start(); pass("Should start from Dockerfile"); } finally { container.stop(); } } }