首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Java测试容器在Docker多阶段构建中工作?

如何让Java测试容器在Docker多阶段构建中工作?
EN

Stack Overflow用户
提问于 2020-06-03 13:54:19
回答 2查看 1.6K关注 0票数 3

我有一个类似于Run (Docker) Test Container in gitlab with Maven的问题。不同之处在于,它运行的不是我的脚本直接运行mvn,而是运行在docker映像中运行测试的docker多级构建。不幸的是,这似乎不适用于PostgreSQL测试容器。

Dockerfile

代码语言:javascript
复制
#############
### build ###
#############

# base image
FROM maven:3-jdk-11 as build

# set working directory
WORKDIR /app

# add app
COPY . .

RUN export MAVEN_OPTS="-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" && export MAVEN_CLI_OPTS="-B -U --batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

RUN mvn $MAVEN_CLI_OPTS clean install

############
### prod ###
############

# Yea this isn't right, but it crashes before it gets to this point. This is for example purposes only.
FROM openjdk:15-jdk-alpine
COPY --from=build /app/reproducer-testcontainer/target/reproducer-testcontainer.jar /reproducer-testcontainer.jar
CMD java -jar reproducer-testcontainer.jar

当我运行mvn clean install时,它正常工作,并使用PostgreSQL测试容器运行测试。但是,当我运行docker build .时,它会在mvn干净安装步骤中失败,下面的堆栈跟踪是这样的。

堆栈跟踪:

代码语言:javascript
复制
13:05:01.250 [main] ERROR org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy - ping failed with configuration Environment variables, system properties and defaults. Resolved: 
     dockerHost=unix:///var/run/docker.sock
     apiVersion='{UNKNOWN_VERSION}'
     registryUrl='https://index.docker.io/v1/'
     registryUsername='root'
     registryPassword='null'
     registryEmail='null'
     dockerConfig='DefaultDockerClientConfig[dockerHost=unix:///var/run/docker.sock,registryUsername=root,registryPassword=<null>,registryEmail=<null>,registryUrl=https://index.docker.io/v1/,dockerConfigPath=/root/.docker,sslConfig=<null>,apiVersion={UNKNOWN_VERSION},dockerConfig=<null>]'
  due to org.rnorth.ducttape.TimeoutException: Timeout waiting for result with exception
 org.rnorth.ducttape.TimeoutException: Timeout waiting for result with exception
    at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:51)
<snip>
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
 Caused by: java.io.IOException: com.sun.jna.LastErrorException: [2] No such file or directory
    at org.testcontainers.shaded.org.scalasbt.ipcsocket.UnixDomainSocket.<init>(UnixDomainSocket.java:62)
<snip>
    at java.base/java.lang.Thread.run(Thread.java:834)
 Caused by: com.sun.jna.LastErrorException: [2] No such file or directory
    at org.testcontainers.shaded.org.scalasbt.ipcsocket.UnixDomainSocketLibrary.connect(Native Method)
    at org.testcontainers.shaded.org.scalasbt.ipcsocket.UnixDomainSocket.<init>(UnixDomainSocket.java:57)
    ... 35 common frames omitted

在我的CI管道中,我只想运行docker build .,而不担心会有另一个做mvn clean install的阶段。

如何修复配置以使java PostgreSQL测试容器在Docker构建中工作,以便在多阶段构建中使用它?

完整代码示例:https://gitlab.com/raymondcg/reproducer-testcontainer

EN

回答 2

Stack Overflow用户

发布于 2020-06-03 17:07:27

与测试容器无关。

测试容器需要一个有效的Docker守护进程。生成映像时,不存在安装到映像生成上下文中的守护进程。

通过执行以下操作,您可以轻松地验证这一点:

代码语言:javascript
复制
RUN curl --unix-socket /var/run/docker.sock http:/_/_ping

让这个命令返回"OK“(不需要运行Testcontainers代码),您的测试也会通过。

票数 1
EN

Stack Overflow用户

发布于 2021-06-10 13:24:26

您可以通过添加以下内容来覆盖测试容器默认的停靠主机:

代码语言:javascript
复制
ENV DOCKER_HOST=tcp://host.docker.internal:2375

进入你的建造阶段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62174634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档