我无法将主机目录(在 rasberry pi 上)挂载到 docker 容器 api_service
。即使是主机 chmod -R 777
。
我能够安装它从命令行 api_service
和 docker 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 build
和 docker-compose up
。
我错过了什么?有没有办法在容器启动时跟踪挂载选项?
是否应该在将目标映像挂载到 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/
FROM postgres:latest
LABEL maintainer="me@mail.com"
RUN mkdir -p /docker-entrypoint-initdb.d
COPY yarmp-dump.sql /docker-entrypoint-initdb.d/
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"]
答案 0 :(得分:1)
似乎我的整个 docker-compose.yaml
文件都不正确。
正如@xdhmoore 所指出的,存在一个缩进问题,以及其他问题。
我发现:
docker-compose config
/usr/share/vim/vim81/ftplugin/yaml.vim
正确地用空格替换了制表符...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
对齐是有道理的。缩进更多表示您正在继续一个多行字符串,我认为如果您缩进较少(例如与 -
对齐),您会收到错误或最终将键值对添加到更高的对象之一层次结构。
无论如何,这肯定令人困惑。我发现此类在线工具很有帮助。