使用Jib(Maven、Docker、TestContainers)获取特定版本的图像

mgdq6dx1  于 2022-09-19  发布在  Maven
关注(0)|答案(1)|浏览(173)

我在试着理解一位同事的评论。我们正在使用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指定版本-它将始终旋转最新版本。

抱歉,这篇文章太长了,我只是想“展示一下我的作品”。欢迎任何提示。我会继续找的。

5tmbdcev

5tmbdcev1#

我不能评论您自己的内部实现的细节,但ImageResolver似乎在您的本地文件系统上工作,例如,它查看您的target/目录并触及类路径。我可以想象这段代码只是为了解析实际的图像名称(而不是图像)而编写的,因为它还返回String

关于latest,对Docker映像使用latest标记通常被认为是反模式的,所以您的同事可能正在评论这一点。以下是来自Web的一篇随机文章,解释了latest标记:https://vsupalov.com/docker-latest-tag/的一些问题

此外,我不明白为什么你在这里问这些针对你的项目的问题,而不是问你的同事。

相关问题