【问题标题】:Write access on volume for CNB Docker image对 CNB Docker 映像的卷的写入权限
【发布时间】:2021-04-27 09:05:34
【问题描述】:

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

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

因此,在 docker compose 文件中,我定义了一个堆栈,其中包含(不重要的)mysql db 和 spring boot 应用程序,如下所示:

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:更改“/var/mypath/”的所有权:不允许操作

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

【问题讨论】:

    标签: spring-boot docker-compose docker-volume


    【解决方案1】:

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

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

    用户@Stuck 还通过创建另一个 docker-image 层提出了一种更精细的方法:can `bootBuildImage` create writeable volumes?

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

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2018-11-24
      • 2017-09-23
      • 2017-05-04
      相关资源
      最近更新 更多