我在试着理解一位同事的评论。我们正在使用testcontainers创建一个灯具:
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.utility.DockerImageName;
public class SalesforceFixture extends GenericContainer<SalesforceFixture> {
private static final String APPLICATION_NAME = "salesforce-emulator";
public SalesforceFixture() {
// super(ImageResolver.resolve(APPLICATION_NAME));
super(DockerImageName.parse("gcr.io/ad-selfserve/salesforce-emulator:latest"));
...
}
...
注解代码是它以前的样子。下一行是我同事的建议。在那句话中,他评论道:
这是我不知道的部分。[ImageResolver]获取仿真器的特定版本,而不是最新版本。不过,您需要一个docker-info文件,而jib不会自动生成该文件(但我认为它可以)。
这是我到目前为止所知道或想出来的:
1.SalesforceFixture是将被其他项目用来编写测试的类。它在Docker中启动一个容器,运行一个模拟真实服务的API的服务。这就像是服务的本地版本,其行为“足够”像真正的服务,如果您使用Fixture编写代码和测试,那么它“应该”在生产环境中工作。(我的知识到此为止。)
1.我查看了ImageResolver
-它似乎是我们编写的一个在文件系统中搜索某些内容的类:
public static String resolve(String applicationName, File... roots) {
Stream<File> searchPaths = Arrays.stream(roots).flatMap((value) -> {
return Stream.of(new File(value, "../" + applicationName), new File(value, applicationName));
});
Optional<File> buildFile = searchPaths.flatMap((searchFile) -> {
if (searchFile.exists()) {
File imageFile = new File(searchFile + File.separator + "/target/docker/image-name");
if (imageFile.exists()) {
return Stream.of(imageFile);
}
}
return Stream.empty();
}).findAny();
InputStream build = (InputStream)buildFile.map(ImageResolver::fileStream).orElseGet(() -> {
return searchClasspath(applicationName);
});
if (build != null) {
try {
return IOUtils.toString(build, Charset.defaultCharset()).trim();
} catch (IOException var6) {
throw new RuntimeException("An exception has occurred while reading build file", var6);
}
} else {
throw new RuntimeException("Could not resolve target image for application: " + applicationName);
}
}
但我很困惑。什么文件系统?比如,目前的工作目录是什么?我的本地计算机,无论我从哪里运行Java程序?或者这是从某个容器中取出的?(我不这么认为。)或者可能是.jar文件中的目录结构?还是在gcr.io的某个地方?
1.他所说的“具体版本号”与“最新版本号”是什么意思?我的意思是,当我建造这个项目时,它建造的任何东西都是我的全部。这不是等同于“最新”吗?在什么情况下会出现较旧版本的图像?(这让我想起了gcr.io。)
1.或者,他的意思是,在使用此项目映像的项目中,用户将无法通过Maven/pom.xml指定版本-它将始终旋转最新版本。
抱歉,这篇文章太长了,我只是想“展示一下我的作品”。欢迎任何提示。我会继续找的。
1条答案
按热度按时间5tmbdcev1#
我不能评论您自己的内部实现的细节,但
ImageResolver
似乎在您的本地文件系统上工作,例如,它查看您的target/
目录并触及类路径。我可以想象这段代码只是为了解析实际的图像名称(而不是图像)而编写的,因为它还返回String
。关于
latest
,对Docker映像使用latest
标记通常被认为是反模式的,所以您的同事可能正在评论这一点。以下是来自Web的一篇随机文章,解释了latest
标记:https://vsupalov.com/docker-latest-tag/的一些问题此外,我不明白为什么你在这里问这些针对你的项目的问题,而不是问你的同事。