繁体   English   中英

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

[英]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 设置中的驱动器共享有关。 在 Windows 上,我发现需要启用驱动器共享。

如果它已经启用并且您最近更改了您的 PC 密码,您需要禁用驱动器共享(并单击“应用”)并重新启用它(然后单击“应用”)。 在此过程中,系统将提示您输入 PC 的新密码。 在此过程之后,再次运行您的 docker 命令(运行或撰写) 在此处输入图片说明

尝试使用:

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

如果您在 Mac 上使用 Docker,那么您需要将 go 用于:

Docker Desktop -> Preferences -> Resources -> File Sharing

并添加您要挂载的文件夹。 看截图:

在此处输入图像描述

我不知道其他人是否犯了同样的错误,但主机目录路径必须从 /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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM