对 CNB Docker 映像的卷的写访问权限

Write access on volume for CNB Docker image

我正在开发一个 spring 引导应用程序,应该将其迁移到 docker 容器中(用于 运行 作为服务器上的系统服务) 该应用程序在文件系统上读取和写入可配置路径 - 现在假设它是 /var/mypath

我使用 spring 的 gradle 插件中的 bootBuildImage 任务构建了一个 docker 图像。它使用似乎是默认构建器映像的内容,即 gcr.io/paketo-buildpacks/builder 来构建应用程序映像。

因此,在 docker 撰写文件中,我定义了一个堆栈,其中包含(不重要的)mysql 数据库和 spring 启动应用程序,如下所示:

version: "3.8"

services:
  backend_db:
    container_name: "backend_db"
    image: "mariadb:latest"
    # ...

  backend_app:
    depends_on:
      - "backend_db"
    container_name: "backend_app"
    image: "myImageName:latest"
    restart: always
    ports:
      - 8080:8080
    volumes:
      - "app:/var/mypath"
    environment:
      # mysql data etc...

volumes:
  db:
  app:

当我使用 docker-compose up 启动它时,spring-boot 应用程序在 /var/mypath 上没有写入权限。 我发现,显然 CNB 构建使 spring 应用程序 运行 作为用户 cnb。 我想,该卷是以 root 用户身份创建的,只有 root 用户对其具有写入权限。

手动 chown 方法似乎不是最佳选择,因为我本来希望能够 docker-compose up 在服务器上完成并完成,而不是手动 chown,但无论如何: 我已尝试 chown 从容器内向 cnb 用户发送音量,但没有成功:

chown cnb /var/mypath/ chown: changing ownership of '/var/mypath/': Operation not permitted

如何确保 spring 引导应用程序可以写入卷?

毕竟我设法 chown/chgrp 音量 - 我的错误是它在容器内不起作用(没有 sudo) - 但它在外部使用 docker exec 工作,指定根用户:

docker exec -u 0 -it backend_app chown cnb /var/mypath
docker exec -u 0 -it backend_app chgrp cnb /var/mypath

用户@Stuck 还通过创建另一个 docker-图像层建议了一种更精细的方法:

来自 Spring 的 Andy Wilkinson 指出这是一个普遍的 Docker 问题 - 所以如果将来出现其他解决方案,我很高兴更新这个问题。