簡體   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