已安装的卷在容器内是空的
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
它是空的。
我做错了什么?
根据 docker 卷文档,
https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume
The host-dir can either be an absolute path or a name value. If you
supply an absolute path for the host-dir, Docker bind-mounts to the
path you specify. If you supply a name, Docker creates a named volume
by that name
尝试使用:
volumes:
- ./server:/server
而不是 server/
-- 在某些情况下 Docker 不喜欢结尾的斜杠。
除了此处的答案外,它可能与 Docker 设置中的驱动器共享有关。在 Windows,我发现需要启用驱动器共享。
如果它已经启用并且您最近更改了 PC 的密码,您需要禁用驱动器共享(并单击 "Apply")并再次重新启用它(并单击 "Apply")。在此过程中,系统会提示您输入 PC 的新密码。在此过程之后,再次 运行 您的 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开始
所以我的想法是,在我的 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 用于 Mac,那么您需要前往:
Docker Desktop -> Preferences -> Resources -> File Sharing
并添加您要挂载的文件夹。见截图:
在我的例子中,卷是空的,因为我没有使用正确的不带引号的路径格式。
如果你有一个包含空格的相对或绝对路径,你不需要在路径周围使用双引号,你可以使用任何包含空格的路径并且它会被理解,因为 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
我有一个 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
它是空的。
我做错了什么?
根据 docker 卷文档,
https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume
The host-dir can either be an absolute path or a name value. If you supply an absolute path for the host-dir, Docker bind-mounts to the path you specify. If you supply a name, Docker creates a named volume by that name
尝试使用:
volumes:
- ./server:/server
而不是 server/
-- 在某些情况下 Docker 不喜欢结尾的斜杠。
除了此处的答案外,它可能与 Docker 设置中的驱动器共享有关。在 Windows,我发现需要启用驱动器共享。
如果它已经启用并且您最近更改了 PC 的密码,您需要禁用驱动器共享(并单击 "Apply")并再次重新启用它(并单击 "Apply")。在此过程中,系统会提示您输入 PC 的新密码。在此过程之后,再次 运行 您的 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开始
所以我的想法是,在我的 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 用于 Mac,那么您需要前往:
Docker Desktop -> Preferences -> Resources -> File Sharing
并添加您要挂载的文件夹。见截图:
在我的例子中,卷是空的,因为我没有使用正确的不带引号的路径格式。
如果你有一个包含空格的相对或绝对路径,你不需要在路径周围使用双引号,你可以使用任何包含空格的路径并且它会被理解,因为 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