繁体   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