Проблема монтирования локального каталога в контейнер в Docker (тома Docker). - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть три файла:

Dockerfile:

FROM php:7.2-apache
COPY src/ /var/www/html
EXPOSE 80

докер-compose.yml:

version: '3'

services:
    hello-world:
        build: .
        volumes:
         - ./src:/var/www/html
        ports:
         - 80:80

SRC / index.php:

<?php

echo "Hello World!";
?>

Затем я запускаю команду:

docker-compose up

И до этого момента все было хорошо, но когда я получаю доступ к localhost в своем браузере, я получаю:

403 Запрещено У вас нет разрешения на доступ к / на этом сервере.

... а из контейнера выдается сообщение об ошибке:

Невозможно обслуживать каталог / var / www / html /: не найдено соответствующего DirectoryIndex (index.php, index.html), и сгенерированный сервером индекс каталога запрещен директивой Options

Однако, если я из файла docker-compose.yml удалил 2 строки:

        volumes:
         - ./src:/var/www/html

... все отлично работает (кроме папки не смонтированной). Что я делаю неправильно? Очевидно, что мне не нравится монтировать том, из-за чего каталог / var / www / html / становится пустым, но почему?

1 Ответ

0 голосов
/ 04 сентября 2018

В вашем файле сборки вы копируете содержимое src в образ (под /var/www/html). Каталог src является частью контекста сборки и должен находиться ниже корневого каталога 'build'. Вероятно, именно здесь вы запустили команду сборки docker, и обычно это место, где живет dockerfile.

В вашем файле compose вы отображаете каталог src поверх /var/www/html, заменяя его содержимое на src во время выполнения.

Я предполагаю, что вы действительно хотите сделать одну из этих двух вещей. В любом случае это хорошо, в зависимости от того, чего вы пытаетесь достичь, но на основании вашего отчета похоже, что место, из которого вы запускаете docker-compose up, имеет пустой каталог src, отсюда и сообщение об ошибке. Чтобы это исправить, либо используйте абсолютный путь к каталогу, который вы хотите обслуживать, либо удалите определение volumes для этого контейнера.

Один из способов проверить это (при условии, что вы пометили свое изображение HelloWorld):

docker run -it -d --name helloworld -p 80:80 HelloWorld

Тогда docker ps просто чтобы убедиться, что он работает. Если все хорошо, попробуйте это:

docker exec -it -w /var/www/html helloworld ls -gAlFh

Это должно дать вам список того, что находится в этом каталоге. Вы также можете попробовать это:

docker exec -it -w /var/www/html helloworld sh

Чтобы получить оболочку в этом каталоге, чтобы вам было легче исследовать ее.

...