【问题标题】:Why in docker-compose I should write full path to volume?为什么在 docker-compose 我应该写卷的完整路径?
【发布时间】:2020-05-06 08:47:19
【问题描述】:

我对 docker-compose 卷(在 docker windows 服务器(容器)中)有一些令人困惑的时刻。 我写了下一个配置

volumes:
  - "C:/ProgramData/Docker/volumes/admin-stat-logs:C:/app/Logs"

以及为什么需要写入卷的完整路径?

如果我写:

volumes:
  - "admin-logs:C:/app/Logs"

它会产生错误 错误:在服务“admin-stat-table”中使用了命名卷“admin-logs:C:/app/Logs:rw”,但在卷部分未找到声明。

为什么会这样?

更新

让我表明我的意思(我做了错误的解释)。在一张图片中,我们有一个来自官方文档的简短公告。

我的情况也是这样写的:

volumes:
  - admin-logs:C:/app/Logs

我之前通过终端创建卷。当我启动 docker-compose up 我得到下一个错误

错误:服务“admin-stat-table”中使用了命名卷“admin-stat-logs:C:/app/Logs:rw”,但未在卷部分找到声明。

我在第一种情况下犯了一个错误,这是一个简单的文件夹挂载,请原谅我的误解。

volumes:
  - "C:/ProgramData/Docker/volumes/admin-stat-logs:C:/app/Logs"

【问题讨论】:

    标签: docker docker-compose docker-for-windows


    【解决方案1】:

    您不需要使用完整路径。您可以使用指向 docker-compose.yml 文件位置的相对路径。

    当您编写 admin-logs:C:/app/Logs 时,您是在告诉 docker-compose 使用名为 admin-logs 的卷。如果要使用docker-compose所在的文件夹,可以写./admin-logs:C:/app/Logs

    如果你打算使用一个单独的 docker 卷,你需要首先在 docker-compose.yml 中定义它。以下是涵盖这两种情况的示例:

    version: '3'
    services:
      mytest:
        image: ubuntu:18.04
        volumes:
          - "mymnt:/mnt/volume"
          - "./mymnt_on_host:/mnt/mounted_folder"
    volumes:
      mymnt:
    

    您需要在 docker-compose.yml 所在的文件夹中有一个 mymnt_on_host 目录。

    有关此主题的更多信息,您可以查看 docker-compose.yml 的 reference guide

    更新:

    如果您打算在 docker-compose 中使用已创建的卷,则可以在卷定义中使用 external: true

    例如

    version: '3'
    services:
      mytest:
        image: ubuntu:18.04
        volumes:
          - "mymnt:/mnt/volume"
          - "./mymnt_on_host:/mnt/mounted_folder"
    volumes:
      mymnt:
      my_existing_volume:
        external: true
    

    现在,如果您启动它,docker-compose 将不会尝试生成 my_existing_volume,但它会期望已经在机器上找到它。

    更多信息请查看external参考。

    【讨论】:

    • 但是你不需要写完整的路径来使用卷,对吧?我应该,因为如果没有,我会得到一个错误。问题是:如果我只写卷名,为什么会出错,为什么这么有必要?
    • 您不需要完整路径。正如我所写,您可以使用指向 docker-compose.yml 位置的相对路径。在您的情况下,您尝试使用未定义的卷。
    • 好的,我想我明白你的意思了。您会收到该错误,因为卷声明必须存在于 docker-compose.yml 中。您不能简单地事先创建它并启动容器。
    • lulz,这是我第一次得到F。你能接受答案吗?
    【解决方案2】:

    您能否在docker-compose.yml 文件中显示您的版本值。它应该是version: '3'version: '3.5'。可能你有version: '2'

    【讨论】:

    • 所有版本的 Compose YAML 文件的卷语法都是相同的(并反映了 docker run -v 选项,该选项也基本上从未改变过)。
    • @DavidMaze 正确,但我遇到了类似的问题,我记得,只是将其更改为已修复的版本 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2018-08-07
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多