无法使用docker-compose挂载卷。

5

我正在尝试使用docker-compose运行一个挂载本地卷的Docker容器。但是由于无法成功,我已将docker-compose降级为最基本的版本:

version: '2'

services:
  php:
    image: php:5.6-apache
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html

执行此操作后,挂载点将显示在docker inspect命令中:
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/clark/Projects/apis/contracts",
                "Destination": "/var/www/html",
                "Mode": "rw",
                "RW": true,
                "Propagation": ""
            }
        ],

但是容器中的 /var/www/html 目录是空的。
我尝试了我能想到的所有组合。绝对路径,相对路径,${pwd},命名卷,挂载到已存在的目录,挂载到不存在的目录......这让我发疯了。
请问有谁可以告诉我我错在哪里了吗?

你的compose文件是完全有效的,应该可以工作。请更新问题,说明您如何检查容器中的目录是否为空 - 可能问题就在那里(FS权限)。建议提到操作系统(无论您使用GNU / Linux还是macOS,或者可能是Windows的WSL - 这也很重要)。下面的答案使用command:ls -la / var / www / html是一个好主意,如果这是一些非常奇怪的东西,则command:cat / proc / mounts(或docker-compose exec php cat / proc / mounts,而容器正在运行)也可以提供一些潜在有用的诊断信息。 - drdaeman
仍然遇到相同的问题,仍不清楚如何解决它... - Eugene
1个回答

3
这里的工作和之前一样,唯一的区别是使用了版本3的docker-compose文件。
mkdir /tmp/compose-test && cd /tmp/compose-test
touch iam_a_file

Docker compose文件:

---
version: '3'

services:
  test:
    image: busybox
    command: ls -la /var/www/html
    volumes:
      - .:/var/www/html

确保配置正确:

docker-compose config

更新所有的内容

docker-compose up
Creating composetest_test_1
Attaching to composetest_test_1
test_1  | total 8
test_1  | drwxr-xr-x    2 1000     users           80 Apr 26 16:47 .
test_1  | drwxr-xr-x    1 www-data www-data      4096 Apr 26 16:49 ..
test_1  | -rw-r--r--    1 1000     users          126 Apr 26 16:48 docker-compose.yml
test_1  | -rw-r--r--    1 1000     users            0 Apr 26 16:46 iam_a_file

检查显示,当您提供相对路径时,Docker会将其更改为完整路径。
编辑:我还尝试了php:5.6-apache,它可以工作。

感谢您的回复。好的,有个奇怪的事情,当我尝试使用您的 ls -la /var/www/html 命令时,它显示了整个目录,就像我所期望的一样!但是当我使用 docker -it run <name> /bin/bash 进入系统时,该目录为空。浏览到容器的 Apache 服务器也显示该目录为空。 - Raiden616
3
如果您在运行Docker时没有提供-v标志,则会创建一个新的容器。如果要在已经运行的容器中执行操作,请尝试使用docker exec命令。 - papey
好的!哈哈,我在打字的时候就想到了这个问题。好的,docker-compose exec ls /var/html/www 显示了我期望的结果。然而,Apache 的列表仍然是空的...另外,不确定是否相关,但我的容器没有任何 IP 地址。有什么原因吗? - Raiden616
可能与Apache配置不允许目录列表有关,但我不是Apache专家。 - papey
1
如果Apache在容器中作为非root用户运行,则可能与文件系统权限有关。 运行docker-compose exec php /bin/bash,然后运行ps aux以查看Apache运行的用户是哪个。如果它不是root而是例如www-data,则可能是原因(检查ls -lad /var/www/html输出以查看实际目录权限,以确定Apache是否可以列出其内容)。 - drdaeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接