Skip to content

Instantly share code, notes, and snippets.

@shelajev
Created February 22, 2024 17:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shelajev/ac6fbc3ec61401b8a6e14844c2a3c128 to your computer and use it in GitHub Desktop.
Save shelajev/ac6fbc3ec61401b8a6e14844c2a3c128 to your computer and use it in GitHub Desktop.
NgrokContainer
package org.testcontainers.repro;
import com.github.dockerjava.api.command.InspectContainerResponse;
import org.testcontainers.Testcontainers;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.images.builder.Transferable;
import org.testcontainers.shaded.org.bouncycastle.util.Strings;
import org.testcontainers.utility.DockerImageName;
import java.util.Arrays;
import java.util.Scanner;
public class NgrokContainer extends GenericContainer {
private static final String defaultConfig =
"""
version: 2
authtoken: %s
log: stdout
tunnels:
website:
addr: host.testcontainers.internal:%d
basic_auth:
- "admin:i-like-trains"
schemes:
- https
inspect: false
proto: http
""";
public NgrokContainer(DockerImageName dockerImageName, int port) {
super(dockerImageName);
dockerImageName.assertCompatibleWith(DockerImageName.parse("ngrok/ngrok"));
withAccessToHost(true);
Testcontainers.exposeHostPorts(port);
String ngrokToken = System.getenv("NGROK_TOKEN");
withCopyToContainer(Transferable.of(defaultConfig.formatted(ngrokToken, port)), "/etc/ngrok.yml");
withCommand("start", "--all", "--config", "/etc/ngrok.yml");
waitingFor(Wait.forLogMessage(".*started tunnel.*", 1));
}
@Override
protected void containerIsStarted(InspectContainerResponse containerInfo) {
super.containerIsStarted(containerInfo);
String logs = this.getLogs();
Arrays.stream(logs.split(System.lineSeparator())).forEach(s -> {
if (s.contains("url=")) {
logger().info("========================");
logger().info("\n\n\n");
logger().info("Click me: " + s.substring(s.indexOf("url=")+4));
logger().info("\n\n\n");
logger().info("========================");
}
});
}
public static void main(String... args) {
NgrokContainer ngrokContainer = new NgrokContainer(DockerImageName.parse("ngrok/ngrok:3-alpine"), 8000);
ngrokContainer.start();
Scanner sc = new Scanner(System.in);
sc.nextLine();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment