docker 无法使用 docker-compose

时间:2021-05-10 23:52:27

标签: docker docker-compose

我无法将主机目录(在 rasberry pi 上)挂载到 docker 容器 api_service。即使是主机 chmod -R 777

能够安装它从命令行 api_servicedocker start --mount type=bind,src=/data/yarmp-data,target=/data/yarmp-data docker_api_service_1 运行 docker inspect containerId 在这种情况下,安装部分告诉我安装完成并且在容器内部就是这样。但我想通过 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"]

2 个答案:

答案 0 :(得分:1)

似乎我的整个 docker-compose.yaml 文件都不正确。

正如@xdhmoore 所指出的,存在一个缩进问题,以及其他问题。

我发现:

  1. 验证 docker-compose.yaml 与 docker-compose config
  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: 

答案 1 :(得分:1)

这是基于您的答案中的 YAML。当我将其插入 this yaml to json converter 时,我得到:

{
   "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 中的 - type 对齐,您最终会得到:

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

YAML 中的缩进很棘手(而且很重要),所以我发现上述和类似的工具有助于获得我想要的东西。它还帮助我从列表、对象和字符串的角度考虑 YAML。此处 - 在列表中创建一个新项目,type: bind 是该项目(不在列表中)中的键值。那么 source: blarg 也是同一个 item 中的键值,所以它应该与 t 中的 type 对齐是有道理的。缩进更多表示您正在继续一个多行字符串,我认为如果您缩进较少(例如与 - 对齐),您会收到错误或最终将键值对添加到更高的对象之一层次结构。

无论如何,这肯定令人困惑。我发现此类在线工具很有帮助。