簡體   English   中英

docker 無法使用 docker-compose 將主機目錄安裝到 docker 容器

[英]docker unable to mount host directory to docker container with docker-compose

我無法將主機目錄(在 rasberry pi 上)掛載到 docker 容器api_service 即使使用主機chmod -R 777

能夠從命令行docker start --mount type=bind,src=/data/yarmp-data,target=/data/yarmp-data docker_api_service_1docker inspect containerId掛載它運行api_service我已經完成了安裝,並且在容器內就是這種情況。 但我想用docker-compose來實現。

我在docker-compose.yaml文件中嘗試了不同的語法,但從未實現。 每次刪除所有容器、圖像,然后docker-compose builddocker-compose up

我錯過了什么? 有沒有辦法在容器啟動時跟蹤掛載選項? 在將目標映像掛載到docker-compose.yaml之前,是否應該在目標映像中創建目標目錄?

docker-compose.yaml

#Doc: https://github.com/compose-spec/compose-spec/blob/master/spec.md
version: '3.2'
services:
        api_service:
                build: ./api_service
                restart: always
                ports:
                        - target: 8080
                        published: 8080
                depends_on:
                        - postgres_db
                links:
                        - postgres_db:yarmp-db-host # database is postgres_db hostname into this api_service
                volumes:
                        - type: bind 
                        source: $HOST/data/yarmp-data #Host with this version not working
                        source: /data/yarmp-data #Host absolute path not working
                        #source: ./mount-test #not working either
                        target: /data/yarmp-data
                        #- /data/yarmp-data:/data/yarmp-data # not working either
        postgres_db:
                build: ./postgres_db
                restart: always
                ports:
                        - target: 5432
                        published: 5432
                env_file:
                        - postgres_db/pg-db-database.env # configure postgres
                volumes:
                        - database-data:/var/lib/postgresql/data/ 

postgres_db/Dockerfile

FROM postgres:latest
LABEL maintainer="me@mail.com"

RUN mkdir -p /docker-entrypoint-initdb.d
COPY yarmp-dump.sql /docker-entrypoint-initdb.d/

api_service/Dockerfile

FROM arm32v7/adoptopenjdk
LABEL maintainer="me@mail.com"

RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]


#csv files data
RUN mkdir -p /data/yarmp-data #Should I create it or not??

RUN mkdir -p /main-app
WORKDIR /main-app
# JAVA APP DATA
ADD my-api-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","/main-app/app.jar"]

似乎我的整個docker-compose.yaml文件不正確。

正如@xdhmoore 所指出的,存在縮進問題等。

我想通了:

  1. 使用docker-compose config驗證docker-compose.yaml
  2. YAML 規范不允許使用制表符,只能使用空格進行縮進
  3. 請注意, vim默認配置文件/usr/share/vim/vim81/ftplugin/yaml.vim用空格替換制表符是正確的...
  4. 長語法的縮進是在我的編輯器上使用制表符完成的,而之前的 2 個空格正在工作。 這是我的最終 docker-compose.yaml

docker-compose.yaml

version: '3.2'
services:
api_service:
    build: ./api_service
    restart: always
    ports:
    - target: 8080
        published: 8080 #2 spaces before published
    depends_on:
    - postgres_db
    links:
    - postgres_db:yarmp-db-host
    volumes:
    - type: bind 
        source: /data/yarmp-data #2 spaces before source, meaning same level as previous '- types:...' and add 2 spaces more
        target: /data/yarmp-data #2 spaces before target
postgres_db:
    build: ./postgres_db
    restart: always
    ports:
    - target: 5432
        published: 5432 #2 spaces before published
    env_file:
    - postgres_db/pg-db-database.env # configure postgres
    volumes:
    - database-data:/var/lib/postgresql/data/
volumes:
    database-data: 

這是基於您的答案中的 YAML 。 當我將它插入這個 yaml 到 json 轉換器時,我得到:

{
   "version": "3.2",
   "services": null,
   "api_service": {
      "build": "./api_service",
      "restart": "always",
      "ports": [
         {
            "target": "8080\npublished: 8080"
         }
      ],
      "depends_on": [
         "postgres_db"
      ],
      "links": [
         "postgres_db:yarmp-db-host"
      ],
      "volumes": [
         {
            "type": "bind\nsource: /data/yarmp-data"
         }
      ]
   },
   "postgres_db": {
      "build": "./postgres_db",
      "restart": "always",
      "ports": [
         {
            "target": "5432\npublished: 5432"
         }
      ],
      "env_file": [
         "postgres_db/pg-db-database.env"
      ],
      "volumes": [
         "database-data:/var/lib/postgresql/data/"
      ]
   },
   "volumes": {
      "database-data": null
   }
}

您可以看到幾個地方的結果類似於"type": "bind\nsource: /data/yarmp-data" YAML 似乎將此處的source行解釋為多行字符串的第二行。 但是,如果您調整縮進以與t in - type對齊,您最終會得到:

...
      "volumes": [
         {
            "type": "bind",
            "source": "/data/yarmp-data",
            "target": "/data/yarmp-data"
         }
      ]
...

YAML 中的縮進很棘手(這很重要),所以我發現上述工具和類似工具有助於獲得我想要的東西。 它還幫助我從列表、對象和字符串的角度考慮 YAML。 這里-在列表中創建一個新項目,然后type: bind是該項目中的鍵值(不在列表中)。 那么source: blarg也是同一個 item 中的 key-value,所以它應該與type中的t對齊是有道理的。 縮進更多表示您正在繼續一個多行字符串,我認為如果您縮進更少(例如與-對齊),您會收到錯誤或最終將鍵值對添加到層次結構更高的對象之一。

無論如何,這肯定令人困惑。 我發現這樣的在線工具很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM