[英]Can not find path to host volume in docker
我正在开发 spring 启动中的应用程序,其中照片将上传到服务器,然后使用 url 从服务器读取。 该应用程序位于 docker 和 tomcat 服务器上。 据我所知,最好的方法是使用主机将照片存储在 docker 卷上。 因此,我使用 docker-compose.yml 文件创建卷并提供主机路径。 文件片段:
version: '3.8'
services:
my-app:
image: app
environment:
- _JAVA_OPTIONS=-Xmx512m -Xms256m
- SPRING_PROFILES_ACTIVE=prod,api-docs
.
.
.
ports:
- 8085:8085
networks:
default:
ipv4_address: 172.19.0.2
volumes:
- ./var/home/my-app:/var/lib/docker/containers/docker_my-app //"path to the host:path to the docker container"
根据我在 Docker 网站上阅读的内容,这就是您应该如何创建到将存储照片的主机的路径,即左侧是主机的路径,右侧是容器的路径。 问题是没有创建或创建路径,但我找不到它。 我还有一个方法,每次检查路径是否存在时都会运行:
@PostConstruct
public void init() {
if (!Files.exists(Paths.get("./var/home/my-app"))) {
try {
Files.createDirectory(root);
} catch (IOException e) {
throw new StorageException("Error initializing directory: " + e.getMessage());
}
}
这会抛出该路径不存在。
所以,我有问题:
您当前正在将文件夹/var/home/my-app
从主机安装到容器内的文件夹/var/lib/docker/containers/docker_my-app
中。
当您的应用程序在容器内运行时,您编写的方法
@PostConstruct
public void init() {
if (!Files.exists(Paths.get("./var/home/my-app"))) {
try {
Files.createDirectory(root);
} catch (IOException e) {
throw new StorageException("Error initializing directory: " + e.getMessage());
}
}
在容器文件系统中创建目录结构/var/home/my-app
。
如果您的 Java 代码用于将数据保存在文件夹/var/home/my-app
下,则应按以下方式创建卷:
volumes:
- /var/home/my-app:/var/home/my-app
假设您的检查方法在您的 Spring 应用程序内,即在 my-app 容器内,您需要检查
/var/lib/docker/containers/docker_my-app
文件夹,而不是
./var/home/my-app
文件夹:
@PostConstruct
public void init() {
if (!Files.exists(Paths.get("/var/lib/docker/containers/docker_my-app"))) {
try {
Files.createDirectory(root);
} catch (IOException e) {
throw new StorageException("Error initializing directory: " + e.getMessage());
}
}
在第一次使用卷文件夹时,应在主机上创建相应的文件夹(因为您正在使用卷定义的短符号)。 应该创建的文件夹将在您的 docker-compose.yml 文件旁边,名为 var/home/my-app
如果那是您的意图,那么我会说,您创建了通往主机的良好路径。
关于你的第三个问题:
如果主机将具有读写权限,我应该在 docker-compose.yml 文件中添加一些内容吗?
这取决于您是否定义了一个用户来隔离您的容器。 看看这里: https://docs.docker.com/engine/security/userns-remap/除非你做了这样的事情,你在容器内的进程以 root 身份运行,然后可以在你的主机上写入,而不管缺少权限.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.