对 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 问题 - 所以如果将来出现其他解决方案,我很高兴更新这个问题。
我正在开发一个 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 问题 - 所以如果将来出现其他解决方案,我很高兴更新这个问题。