bootBuildImage 可以创建可写卷吗?

2023-12-15

给定一个将文件写入的 Spring Boot 应用程序/var/lib/app/files.

我使用 gradle 任务创建一个 docker 映像:

./gradlew bootBuildImage --imageName=app:latest

然后,我想用它docker-compose:

version: '3.5'

services:

  app:
    image: app:latest
    volumes:
      - app-storage:/var/lib/app/files
    // ...ports etc

volumes:
  app-storage:

这将失败,因为该文件夹是在docker-compose up并拥有者root因此,该应用程序没有对该文件夹的写入权限。

快速修复是将图像运行为root通过指定user: root:

version: '3.5'

services:

  app:
    image: app:latest
    user: root # <------------ required
    volumes:
      - app-storage:/var/lib/app/files
    // ...ports etc

volumes:
  app-storage:

这工作正常,但我不想将其运行为root。我想知道如何实现它?我通常可以创建一个Dockerfile这将创建具有正确所有权和写入权限的所需文件夹。但据我所知构建包不使用自定义Dockerfile因此bootBuildImage不会使用它 - 对吗?那么我们如何创建可写卷呢?


通过检查图像我发现构建包使用/cnb/lifecycle/launcher启动应用程序。因此,我能够在启动之前自定义 docker 命令并修复特定文件夹的所有者:

version: '3.5'

services:

  app:
    image: app:latest
    # enable the app to write to the storage folder (docker will create it as root by default)
    user: root
    command: "/bin/sh -c 'chown 1000:1000 /var/lib/app/files && /cnb/lifecycle/launcher'"
    volumes:
      - app-storage:/var/lib/app/files
    // ...ports etc

volumes:
  app-storage:

尽管如此,这仍然不是很好,因为它不是直截了当的(因此我未来的自己将需要花时间再次理解它),而且它的可扩展性也非常有限。

更新 30.10.2020 - Spring Boot 2.3

我们最终创建了另一个 Dockerfile/层,这样我们就不需要在 docker-compose 文件中为此烦恼:

# The base_image should hold a reference to the image created by ./gradlew bootBuildImage
ARG base_image
FROM ${base_image}

ENV APP_STORAGE_LOCAL_FOLDER_PATH /var/lib/app/files

USER root

RUN mkdir -p ${APP_STORAGE_LOCAL_FOLDER_PATH}

RUN chown ${CNB_USER_ID}:${CNB_GROUP_ID} ${APP_STORAGE_LOCAL_FOLDER_PATH}

USER ${CNB_USER_ID}:${CNB_GROUP_ID}

ENTRYPOINT /cnb/lifecycle/launcher

更新 25.11.2020 - Spring Boot 2.4

请注意,上面的 Dockerfile 将导致此错误:

ERROR: failed to launch: determine start command: when there is no default process a command is required

原因是 paketo 构建器的默认入口点发生了更改。更改入口点/cnb/lifecycle/launcher到新的修复它:

ENTRYPOINT /cnb/process/web

另请参阅这个问题:错误:启动失败:确定启动命令:当没有默认进程时,需要命令

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bootBuildImage 可以创建可写卷吗? 的相关文章

随机推荐

  • RMarkdown 生成 HTML 文档注释/评论窗格

    我正在从 Word 文档报告转向使用 RMarkdown 生成的 HTML 文件 然而 我的客户在放弃 Word 后会错过的一大功能是能够轻松地直接向文档添加注释 是否存在一些 HTML Java 等代码片段 可以在 HTML 文档的一侧添
  • ASP GridView 在按钮单击时获取行值

    我正在做什么 单击图像按钮时重置用户密码 到目前为止已完成 添加了 GridViewCommandEventHandler 它正确触发 使用代码来自MSDN 我的 e CommandArgument 得到一个空字符串 并且在运行时抛出错误
  • 运行节点应用程序时 bcrypt 无效的 elf 标头

    我正在为学校开发一个 Nodejs 项目 我无法使用 npm 安装 bcrypt 所以我安装了 bcrypt nodejs 并且该项目昨天运行良好 但是今天 当我做 节点应用程序 时 我遇到了这个错误 node modules bcrypt
  • PHP $_REQUEST 作为数组

    我有一个搜索表单 我想将搜索词作为数组 REQUEST 这样我就可以列出每个搜索词 将每个搜索词包装在一个跨度中以进行样式设置 我怎么做 编辑 这是请求的代码
  • Swift 3.0 无法解析 DispatchQueue 的标识符

    我几个小时以来一直试图找到这个问题的答案 但仍然无济于事 我正在尝试使用以下代码 func fetchPosts ref child Amore child Posts observeSingleEventOfType Value with
  • 我正在尝试将 SFTP 文件(SAS 数据集或令牌)从一台服务器传输到 SAS 中的另一台服务器

    这是我第一次尝试使用 SAS 对文件进行 SFTP 我尝试使用文件名语句 但出现了一些错误 let user userid filename source sftp input sas7bdat user user pass passwor
  • 如何使用多部分实体将图像上传到服务器?

    我正在创建一个应用程序 并在我的应用程序中添加了一个选项来从图库浏览图像 然后上传到服务器 我之前问过这个问题 但没有得到好的答案 为了上传图像 我正在遵循本教程http mayanklangalia blogspot in 2014 04
  • 在 DLL 上使用 WPF 动态创建图像(而不是 GDI+)

    我需要动态生成图像 在阅读教程后here我意识到我可以使用 WPF 中的所有控件和布局来生成渲染 然后将其另存为 JPG 这个想法是使用它来代替 GDI 这是相当原始的 问题是 如何创建一个常规 dll 文件 该文件将以编程方式生成 WPF
  • 使用进程构建器执行两个命令

    我正在尝试编写一个程序 从命令提示符编译另一个 java 文件 不过我有一个问题 此时 它已成功执行编译 Mocha java 的第一部分 但是 我希望它也执行该文件并显示它的输出内容 它什么也没显示 有什么建议么 pb new Proce
  • 以编程方式将加载项宏添加到快速访问工具栏

    我有一个用于格式化 Excel 报告的宏 该宏需要在许多不同的工作簿上运行 因为每天都会生成报告并将其保存到新文件中 这已经在我的个人作业簿中了 我现在需要分享这个宏 我的计划是将该加载项放在我的本地加载项文件夹中 在那里进行任何更新并运行
  • 为Nextjs动态路由添加前缀

    我定义了很多路由 其中 一条路由专用于用户配置文件 每个用户都有一个可通过 HTTP example com username 访问的公共配置文件 我尝试过创建文件pages username js但它似乎不起作用 有没有办法在不通过用户名
  • 当主键具有不同名称时,如何使用 TPT 继承模型?

    针对旧数据库使用 Entity Framework 4 1 我无法生成一组非复数的 TPT 继承模型工作集 并且对公共主键使用不同的名称 我正在使用数据库表 组织 帐户 和 公司 如下所示 Organization Organization
  • 在 VBScript 中读取音乐文件长度

    我只是想知道是否有一种方法可以通过 VBScript 将 mp3 文件的长度以秒为单位获取到变量中 改编自我的答案关于 JScript 的类似问题 您可以使用GetDetailsOfWindows Shell 的方法Folder对象获取音频
  • 将 WordPress jQuery 添加到自定义页面模板

    我有一个插件 它有一个下面的自定义页面模板 该模板需要 jQuery 我有一个变量 link to js 喜欢 google 库 但我希望它将它链接到 WordPress 内部 jQuery 库
  • 如何在 html 片段的 X 段之后插入文本字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 如何用PHP解析和处理HTML content p This is the first paragraph p p This is the second paragraph p p This is t
  • WCF 服务的 SOAP 消息的服务器端跟踪

    我正在努力追随本教程为我的 WCF 服务配置服务器端 SOAP 跟踪 以及MSDN 文档 当我运行测试时 我在 Microsoft 服务跟踪查看器中看到活动 00000000 但消息选项卡为空 C temp Web tracelog svc
  • 排除CDH中spark-core的依赖

    我正在使用 Structured Spark Streaming 写入来自 Kafka 的 HBase 数据 我的集群发行版是 Hadoop 3 0 0 cdh6 2 0 我使用的是 Spark 2 4 0 我的代码如下 val df sp
  • 数据仓库模式:在DWH中直接链接事实表可以吗?

    在DWH中直接链接事实表可以吗 据我了解 在星系模式中事实表没有链接 它们只是有共同的维度表 但是 如果有一个 DWH 模式假设直接链接它们呢 IMO 他们不应该这样做 即使他们可以 事实表通常很大 可能有数十亿行 并以一定的粒度保存度量
  • 使用 ruby​​ 从 html 文档中删除空格

    所以我有一个红宝石字符串 类似于 str n n n n n n n n h1 My Page h1 n n div n p Here is a para graph It can contain spaces that should no
  • bootBuildImage 可以创建可写卷吗?

    给定一个将文件写入的 Spring Boot 应用程序 var lib app files 我使用 gradle 任务创建一个 docker 映像 gradlew bootBuildImage imageName app latest 然后