Назад | Перейти на главную страницу

Nginx в Docker не может получить доступ к монтированию привязки

Резюме:

Я пытаюсь настроить контейнер 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

Попробуйте и отправьте сообщение с обнаруженными вами ошибками, и мы постараемся их исправить.