![](/img/trans.png)
[英]How to mount Docker directory into host directory with docker-compose
[英]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_1
和docker inspect containerId
挂载它运行api_service
我已经完成了安装,并且在容器内就是这种情况。 但我想用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"]
似乎我的整个docker-compose.yaml
文件不正确。
正如@xdhmoore 所指出的,存在缩进问题等。
我想通了:
docker-compose config
验证docker-compose.yaml/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:
这是基于您的答案中的 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.