Резюме:
Я пытаюсь настроить контейнер Nginx как часть стека Docker. Я хочу использовать привязку, чтобы сделать папку на моем компьютере доступной для контейнера как /data/www
и используйте ее в качестве корневой папки для Nginx, из которой будет обслуживать контент. Контейнер Nginx создается и запускается без ошибок, а порт отображается как 8080
; однако, если я действительно попытаюсь перейти на localhost:8080
, Я получаю ошибку HTTP 403.
Подробности:
Вот соответствующая структура папок моего проекта:
/frontend
/static
index.html
frontend.dockerfile
nginx.conf
docker-compose.yml
Папка /frontend/static
это тот, который я пытаюсь добавить в качестве тома для привязки к контейнеру Nginx.
docker-compose.yml
version: '3.7'
services:
frontend:
build:
context: frontend
dockerfile: frontend.dockerfile
ports:
- 8080:80
volumes:
- type: bind
source: ./frontend/static
target: /data/www
read_only: true
frontend.dockerfile
FROM nginx:1.16-alpine
EXPOSE 80
COPY nginx.conf /etc/nginx/nginx.conf
nginx.conf
events {
}
http {
server {
listen 80;
location / {
root /data/www;
}
}
}
Когда я бегу docker-compose up
контейнер создается и запускается без проблем, но когда я набираю localhost:8080
в браузере я получаю HTTP 403 и следующую ошибку в консоли докера:
frontend_1 | 172.18.0.1 - - [04/Aug/2019:22:15:50 +0000] "GET / HTTP/1.1" 403 555 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
frontend_1 | 2019/08/04 22:15:50 [error] 7#7: *1 "/data/www/index.html" is forbidden (13: Permission denied), client: 172.18.0.1, server: , request: "GET / HTTP/1.1", host: "localhost:8080"
Таким образом, Nginx явно получает HTTP-запрос и пытается обслуживать контент (в данном случае index.html
), но у него нет разрешения на доступ к файлам в папке /data/www
, то есть том для привязки.
Я использую Fedora 30. Сам проект находится в моей домашней папке: ~/Dev/sandbox
. Я использовал chmod -R 755 frontend/static
в папке проекта, чтобы предоставить разрешения для папки, которую необходимо связать.
Я также пробовал использовать неальпийский образ Nginx, без разницы.
Это действительно была проблема с разрешением; в частности, проблема с разрешением SELinux. Хотя chmod
установленного объема был установлен на 755, docker
пользователю (под которым выполняются контейнеры Docker) по-прежнему не был предоставлен доступ к нему в соответствии с более строгими правилами SELinux.
Поскольку это было только на моей машине, и мне не хотелось в течение 24 часов углубляться в разрешения SELinux, я просто навсегда переключился на permissive
режим, и моя проблема решилась без сучка и задоринки.
Из-за относительного пути к источнику контекст выполнения для compose может не указывать туда, где вы хотите. Если том привязан к файлу docker-compose.yml, а источник на хосте (пока) там не существует, Docker также создает каталог frontend / static (только с правами root) на хосте (а не только в контейнере) . Найдите и удалите это на хосте с помощью sudo. Затем укажите на источник как абсолютный, а не относительный путь.
Это ясно говорит о том, что это проблема с разрешением. Убедитесь, что корень документа «/ data / www /» принадлежит пользователю Nginx. Вы также можете изменить владельца, введя контейнер с помощью следующих команд.
docker exec -it bash
Попробуйте и отправьте сообщение с обнаруженными вами ошибками, и мы постараемся их исправить.