9

我正在尝试使用https://www.testcontainers.org/固有的https://github.com/testcontainers/testcontainers-scala,如下所示:

final class MessageSpec extends BddSpec
  with ForAllTestContainer
  with BeforeAndAfterAll {


  override val container = GenericContainer("sweetsoft/sapmock").configure{ c =>
    c.addExposedPort(8080)
    c.withNetwork(Network.newNetwork())
  }

  override def beforeAll() {
  }


  feature("Process incoming messages") {  

当我使用 command 运行测试时sbt test,出现以下异常:

15:22:23.171 [pool-7-thread-2] ERROR  [sweetsoft/sapmock:latest] - Could not start container
org.testcontainers.containers.ContainerLaunchException: Timed out waiting for container port to open (localhost ports: [32775] should be listening)
        at org.testcontainers.containers.wait.strategy.HostPortWaitStrategy.waitUntilReady(HostPortWaitStrategy.java:47)
        at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:35)
        at org.testcontainers.containers.wait.HostPortWaitStrategy.waitUntilReady(HostPortWaitStrategy.java:23)
        at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:35)
        at org.testcontainers.containers.GenericContainer.waitUntilContainerStarted(GenericContainer.java:582)

该图像是本地图像:

docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
sweetsoft/sapmock             latest              f02be90356e7        3 hours ago         664MB
openjdk                       8                   bec43387959a        11 days ago         625MB
quay.io/testcontainers/ryuk   0.2.3               64849fd2d464        3 months ago        10.7MB

问题是,它为什么要等待32775端口?港口有什么用?

更新

也许这个日志会有所帮助:

15:47:47.274 [pool-7-thread-4] INFO org.testcontainers.dockerclient.DockerClientProviderStrategy - Found Docker environment with Environment variables, system properties and defaults. Resolved: 
    dockerHost=unix:///var/run/docker.sock
    apiVersion='{UNKNOWN_VERSION}'
    registryUrl='https://index.docker.io/v1/'
    registryUsername='developer'
    registryPassword='null'
    registryEmail='null'
    dockerConfig='DefaultDockerClientConfig[dockerHost=unix:///var/run/docker.sock,registryUsername=developer,registryPassword=<null>,registryEmail=<null>,registryUrl=https://index.docker.io/v1/,dockerConfigPath=/home/developer/.docker,sslConfig=<null>,apiVersion={UNKNOWN_VERSION},dockerConfig=<null>]'

15:47:47.275 [pool-7-thread-4] INFO org.testcontainers.DockerClientFactory - Docker host IP address is localhost
15:47:47.277 [pool-7-thread-4] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: com.github.dockerjava.core.exec.InfoCmdExec@51a07bb5
15:47:47.389 [pool-7-thread-4] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: com.github.dockerjava.core.exec.VersionCmdExec@70fc9b37
15:47:47.392 [pool-7-thread-4] INFO org.testcontainers.DockerClientFactory - Connected to docker: 
  Server Version: 18.09.6
  API Version: 1.39
  Operating System: Ubuntu 18.04.2 LTS
  Total Memory: 7976 MB
15:47:47.395 [pool-7-thread-4] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: ListImagesCmdImpl[imageNameFilter=quay.io/testcontainers/ryuk:0.2.3,showAll=false,filters=com.github.dockerjava.core.util.FiltersBuilder@0,execution=com.github.dockerjava.core.exec.ListImagesCmdExec@562a343]
15:47:47.417 [pool-7-thread-4] DEBUG org.testcontainers.utility.RegistryAuthLocator - Looking up auth config for image: quay.io/testcontainers/ryuk:0.2.3
15:47:47.417 [pool-7-thread-4] DEBUG org.testcontainers.utility.RegistryAuthLocator - RegistryAuthLocator has configFile: /home/developer/.docker/config.json (does not exist) and commandPathPrefix: 
15:47:47.418 [pool-7-thread-4] WARN org.testcontainers.utility.RegistryAuthLocator - Failure when attempting to lookup auth config (dockerImageName: quay.io/testcontainers/ryuk:0.2.3, configFile: /home/developer/.docker/config.json. Falling back to docker-java default behaviour. Exception message: /home/developer/.docker/config.json (No such file or directory)
15:47:47.418 [pool-7-thread-4] DEBUG org.testcontainers.dockerclient.auth.AuthDelegatingDockerClientConfig - Effective auth config [null]
4

1 回答 1

4

原始 java 库已回答您的端口问题。
https://www.testcontainers.org/features/networking/

请注意,这个暴露的端口号是从容器的角度来看的。

从主机的角度来看,Testcontainers 实际上将它暴露在一个随机的空闲端口上。这是设计使然,以避免本地运行的软件或并行测试运行之间可能出现的端口冲突。

因为有这层间接,所以需要在运行时向 Testcontainers 询问实际映射的端口。这可以使用 getMappedPort 方法来完成,该方法将原始(容器)端口作为参数

在 Scala 库中,您可以通过调用来获取此映射端口

container.mappedPort(yourExposedPort) 

错误很可能与此概念有关,您需要在 docker 映像中提前公开该端口。确保您expose 8080在 dockerfile 的某处有命令,或者用于构建您的任何图像都有它

于 2019-05-24T12:18:14.650 回答