已安装的卷在容器内是空的

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 LTSDocker 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