使用 Spring Boot Paketo Buildpack 时的 Dockerfile“VOLUME”等效

问题描述

我目前正在将 Spring Boot App 的容器化从 Dockerfile 文件迁移到 Spring Boot Maven 插件 build-image

现在我想知道如何在这种情况下配置卷。相当于在 VOLUME ["/var/store"] 中有一个 Dockerfile 声明。我已经谷歌搜索了一段时间,感谢帮助。谢谢!

解决方法

这取决于目的。

  1. 如果您想在 buildpack 运行时添加卷挂载,那么您可以将 <binding> 添加到您的 pom.xml

https://docs.spring.io/spring-boot/docs/2.5.2/maven-plugin/reference/htmlsingle/#build-image.customization

在构建镜像时应该挂载到构建器容器的卷绑定挂载。创建构建器容器时,绑定将未经解析和未经验证传递给 Docker。

绑定必须采用以下形式之一:

  • <host source path>:<container destination path>[:<options>]

  • <host volume name>:<container destination path>[:<options>]

例如:当构建包执行时 /host/workspace 被挂载到 /workspace

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <bindings>
                            <binding>/host/workspace:/workspace</binding>
                        </bindings>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

这与使用 pack build --volume 标志相同,如果使用的是 pack cli 而不是 Spring Boot 的 Maven 插件。

  1. 您可以在运行应用程序时绑定卷。这只是使用容器运行时的标准工具和参数。例如,您可以docker run -v 并映射到一个卷中。

  2. 如果您想要 Dockerfile 中 VOLUME 条目的特定行为(实际上没有执行上面的 1 或 2),则不会为使用 Buildpacks 创建的图像公开,这就是 Spring Boot正在使用。如果这是您想要的,我鼓励您read this SO post on volumes 并重新考虑您是否真的需要它。