Docker Compose“不允许卷附加属性”或“卷必须是映射”

Ali*_*inN 1 teamcity docker docker-compose

我正在使用 Maven 插入 docker compose 文件,以便映射 Linux 和 Windows 中的工作目录。插值在两种操作系统上都按预期工作。在我的本地 Windows 环境中,当运行“docker compose up”时,我获得了两个具有映射卷(已存在于主机上)的容器,而没有在顶层指定“volumes:” ,仅在服务级别指定。

但是,如果我尝试在基于 Linux 的 TeamCity 中运行相同的设置,我会收到以下消息“服务“job_controller”引用未定义的卷路径/到/目标/类:无效的撰写项目”

从这里检查其他人的答案后,我明白我还必须在顶层指定“volumes:”,这是我在撰写文件的底部所做的。

现在,系统提示我“不允许卷附加属性 /opt/buildagent/work/9857567c5e342350/path/to/target/classes”

name: Distributed
services:
  create_database:
    container_name: create_database
    command:
    - ./script.sh
    - deployer
    - -f
    - ../config/product-mssql-v11.manifest.yaml
    - drop-create-database-properties
    image: alpine-3-corretto-11-wildfly-11.11.0-SNAPSHOT
    networks:
    - deploy
    volumes:
    - C:\\SourceCode\\Path\\to\\target/classes:/opt/product/config
    healthcheck:
     test: ["CMD", "/opt/product/script.sh", "deployer", "-f", "/opt/product/config/product-mssql-v11.manifest.yaml", "healthy"]
     interval: 20s
     timeout: 60s
     retries: 5

  job_controller:
    container_name: job_controller
    environment:
      DEPLOYMENT_MANIFEST: /opt/product/config/main.manifest.yaml
      PROPERTIES_FILE_NAME: /opt/product/config/risk-wildfly.properties
      JAVA_OPTS: "-Xms1g -Xmx4g -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=1g -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true"
    ports:
    - 8080:8080
    image: alpine-3-corretto-11-wildfly-11.11.0-SNAPSHOT
    volumes:
    - C:\\SourceCode\\Path\\to\\target/classes:/opt/product/config
    networks:
    - deploy
    depends_on:
      create_database:
        condition: service_completed_successfully
    restart: on-failure
    healthcheck:
     test: ["CMD", "/opt/product/script.sh", "health-check", "--context-path","product"]
     interval: 20s
     timeout: 60s
     retries: 5      

networks:
 deploy:
    name: deploy
    external: true
    
volumes:
  C:\\SourceCode\\Path\\to\\target/classes:
    external: true
Run Code Online (Sandbox Code Playgroud)

现在,在本地,如果我尝试使用底部指定的“卷:”运行“docker compose up” ,我也会得到相同的“不允许卷附加属性 C:\SourceCode\Path\to\target/classes”

如果,而不是

volumes:
      C:\\SourceCode\\Path\\to\\target/classes:
        external: true
Run Code Online (Sandbox Code Playgroud)

我用

volumes:
Run Code Online (Sandbox Code Playgroud)

我得到“卷:”必须是一个映射。所以这都不起作用。

C:\>docker compose version
Docker Compose version v2.10.2

C:\>docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020

C:\>docker version
Client:
 Cloud integration: v1.0.29
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:09:02 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.12.0 (85629)
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:23 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
Run Code Online (Sandbox Code Playgroud)

考虑到卷映射,如何在两个操作系统中成功运行它?

小智 6

如果您想将特定文件夹从主机映射到 docker 容器,则不需要 root 部分

volumes:
Run Code Online (Sandbox Code Playgroud)

根本不

它用于在 docker 内部的某处创建命名卷,并在服务定义的卷部分中按名称引用它们(如果设置了外部标志,则跨多个 docker-compose 文件)