繁体   English   中英

在 docker 中找不到主机卷的路径

[英]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());
        } 
}

这会抛出该路径不存在。

所以,我有问题:

  • 我是否为主机创建了一条良好的路径?
  • 或者到主机的路径应该不同?
  • 如果主机将具有读写权限,我应该在 docker-compose.yml 文件中添加一些内容吗?

您当前正在将文件夹/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM