gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:24:36 26 4
gpt4 key购买 nike

我遇到类似于 Run (Docker) Test Container in gitlab with Maven 的问题。区别在于,我的脚本不是直接运行 mvn,而是运行 docker 多阶段构建,在 docker 镜像内部运行测试。不幸的是,这似乎不适用于 PostgreSQL 测试容器。

Dockerfile

#############
### 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 clean install 步骤失败,堆栈跟踪如下。

堆栈跟踪:

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 Testcontainers 在 Docker 构建内部工作,以便我可以在多阶段构建中使用它?

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

最佳答案

与测试容器无关。

测试容器需要有效的 Docker 守护进程。当您构建镜像时,不会将守护进程安装到镜像构建上下文中。

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

RUN curl --unix-socket /var/run/docker.sock http:/_/_ping

使此命令返回“OK”(无需运行 Testcontainers 代码),您的测试也会通过。

关于java - 如何让 Java 测试容器在 Docker 多阶段构建中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62174634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com