1

Тема: Docker+django+file permissions

Вітаю, шановні!

Є аппка на django, запускається в docker. Використовую стандартний django конфіг для медіа файлів.

Проблема: при завантаженні файлу через форму, файл створюється в потрібній папці, але з неправильним os file owner (ті що використовуються в chown):

-rw------- 1 root     www-data 4.5M Dec 11 14:29 <------ bad one
-rw------- 1 www-data www-data 4.5M Dec 11 13:54 <------- normal one

Nginx сервить цю директорію і вимагає, щоб owner був www-data, а django створює з під root.

Здається дві можливих причини:
1. проблема в docker volume. docker-compose:

services:
  web:
    build: .
    restart: on-failure
    container_name: web
    volumes:
      - ../media/:/proj/media

    entrypoint: "/proj/src/docker-entrypoint.sh"
    network_mode: host
    ports:
      - "8080:8080"
    mem_limit: 1000m

2. django. Хз, з якої причини, скільки проектів не піднімав (без докера), ніколи такого не було, з докером ніколи не мав проекту разом з django + media files


Шоделать? Куди копать?

2

Re: Docker+django+file permissions

не зрозумів де nginx?
він в одному контейнері з джанго чи вони по різних?

джанго, як я розумію працює в контейнері з під рута, але можна ж це змінити

Подякували: koala, leofun012

3

Re: Docker+django+file permissions

nginx: встановлений в os, і сервить директорію нічого не знаючи про docker.

джанго, як я розумію працює в контейнері з під рута, але можна ж це змінити

от цього я не знаю, що це означає? Як поглянути? І як змінити?

4 Востаннє редагувалося ping (11.12.2019 20:29:12)

Re: Docker+django+file permissions

Q-bart написав:

nginx: встановлений в os, і сервить директорію нічого не знаючи про docker.

джанго, як я розумію працює в контейнері з під рута, але можна ж це змінити

от цього я не знаю, що це означає? Як поглянути? І як змінити?

ок, спробуємо розібратися,

є контейнер, в ньому є джанго. щоб джанго мало доступ до даних поза контейнером - певний каталог (../media) назвали volume і змотували в контейнер з шляхом /proj/media (це шлях всередині контейнера)

з точки зору джанго - це каталог /proj/media
оскільки джанго (швидше за все) запущено від імені root - відповідно все , що воно пише у
/proj/media буде від root

окремо і незалежно на цьомук ж сервері проживає nginx
він працює паралельно з docker на одному рівні з ним.

відповідно, він не дивиться всередину контейнера, а дивиться на каталог ../media
і бачить там фали, які постворював джанго , запущений з правами root в контейнері
І це суперечить його налаштуванням.

Отже, якщо все описане правильно - два варіанти:
1. знайти - як запустити контейнер і все що в ньому від www-data (чи що там хоче нджінкс)
2. запускати nginx в іншому контейнері (теж від root) , монтуючи йому потрібні ресурси (можна в форматі read-only)
адже ніхто не забороняє нам використовувати один volume в кількох контейнерах

спершу - переконаємося, що припущення про root  - вірне
інструкція exec дозволяє виконати консольну команду всередині контейнера
контейнер має і'мя - `web` (якщо керуватися наведеним конфігом docker-compose:)

$ docker container exec YOUR_CONTAINER_NAME whoami

p.s.
чисто з мойого невеликого досвіду - якщо вже є докер - то краще все контейнеризувати. в т.ч. nginx (варіант №2)
і з бекапами легше і залежностей менше і все гарненько ізольовано по контейнерах, де все права, мережі, спільні ресурси описуються на рівні docker

p.p.s
якщо це сервер, на якоми Ви визначаєте політику - рекомендую поставити собі web-UI для роботи з докером. на початках здорово допомагає зрозуміти як воно все крутиться
https://www.portainer.io/

p.p.p.s
Running a Docker container as a non-root user
https://medium.com/redbubble/running-a- … 2e00f8ee15

Подякували: Q-bart, leofun012

5

Re: Docker+django+file permissions

Дякую, ping!

6

Re: Docker+django+file permissions

p.s.
чисто з мойого невеликого досвіду - якщо вже є докер - то краще все контейнеризувати. в т.ч. nginx (варіант №2)
і з бекапами легше і залежностей менше і все гарненько ізольовано по контейнерах, де все права, мережі, спільні ресурси описуються на рівні docker

Були так, не пам'ятаю чого, але виніс nginx при якомусь масштабуванні