[英]Mounted volume is empty inside container
我有一个docker-compose.yml
这样的:
db:
image: mongo:latest
ports:
- "27017:27017"
server:
image: artificial/docker-sails:stable-pm2
command: sails lift
volumes:
- server/:/server
ports:
- "1337:1337"
links:
- db
server/
是相对于docker-compose.yml
文件的文件夹。 但是,当我docker exec -it CONTAINERID /bin/bash
并检查/server
时,它是空的。
我究竟做错了什么?
尝试使用:
volumes:
- ./server:/server
而不是server/
- 在某些情况下 Docker 不喜欢尾部斜杠。
根据 docker 卷文档,
https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume
主机目录可以是绝对路径或名称值。 如果您为主机目录提供绝对路径,Docker 会绑定挂载到您指定的路径。 如果您提供一个名称,Docker 将通过该名称创建一个命名卷
当我想从命令行挂载目录时,我遇到了类似的问题:
docker run -tid -p 5080:80 -v /d/my_project:/var/www/html/my_project nimmis/apache-php5
容器已成功启动,但挂载目录为空。
原因是挂载的目录必须在用户的主目录下。 所以,我在c:\\Users\\<username>
下创建了一个符号链接,它挂载到我的项目文件夹d:\\my_project
并挂载了那个:
docker run -tid -p 5080:80 -v /c/Users/<username>/my_project/:/var/www/html/my_project nimmis/apache-php5
我不知道其他人是否犯了同样的错误,但主机目录路径必须从 /home 开始
所以我的 msitake 是在我的 docker-compose 中我错误地指定了以下内容:
services: myservice: build: . ports: - 8888:8888 volumes: - /Desktop/subfolder/subfolder2:/app/subfolder
当主机路径应该是 /home 的完整路径时。 就像是:
services: myservice: build: . ports: - 8888:8888 volumes: - home/myuser/Desktop/subfolder/subfolder2:/app/subfolder
在Ubuntu 20.04.4 LTS
上,使用Docker version 20.10.12, build e91ed57
,我开始观察到类似的症状,但没有明显的先前操作。 在执行docker-compose -p production-001 -f deploy/docker-compose.yml up -d --build
命令后,其中一项服务没有更改( production-001-volumeConsumingService is up-to-date
),一部分卷停止安装。
# deploy/docker-compose.yml
version: "3"
services:
...
volumeConsumingService:
container_name: production-001-volumeConsumingService
hostname: production-001-volumeConsumingService
image: group/production-001-volumeConsumingService
build:
context: .
dockerfile: volumeConsumingService.Dockerfile
depends_on:
- anotherServiceDefinedEarlier
restart: always
volumes:
- ../data/certbot/conf:/etc/letsencrypt # mouning
- ../data/certbot/www:/var/www/certbot # not mounting
- ../data/www/public:/var/www/public # not mounting
- ../data/www/root:/var/www/root # not mounting
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
networks:
- default
- external
...
networks:
external:
name: routing
似乎有效的解决方法是在docker-compose -p production-001 -f deploy/docker-compose.yml up -d --build
命令后立即强制重启失败的服务:
docker-compose -p production-001 -f deploy/docker-compose.yml up -d --build && docker stop production-001-volumeConsumingService && docker start production-001-volumeConsumingService
如果在主机重新启动后卷未安装,则应该添加一个cron
任务以重新启动服务一次。
在我的例子中,卷是空的,因为我没有使用正确的路径格式而不带引号。
如果你有一个带空格的相对或绝对路径,你不需要在路径周围使用双引号,你可以使用任何带空格的路径并且它会被理解,因为 docker-compose 有“:”作为分隔符并且确实不检查空间。
不起作用的方法(双引号是问题:):
volumes:
- "MY_PATH.../my server":/server
- "MY_PATH.../my server:/server" (I might have missed testing this, not sure!)
- "./my server":/server
- ."/my server":/server
- "./my server:/server"
- ."/my server:/server"
有两种方法可以做到这一点(没有双引号:):
volumes:
- MY_PATH.../my server:/server
- ./my server:/server
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.