Решил поразбираться в Docker и сделать себе сборку для laravel (LEMP).
Структура сборки:
- docker - файлы настроек и Dockerfile для mysql,php,nginx
- hosts - настройки вир.хостов (nginx)
- logs - логи nginx
- mysql - файлы БД
- www ‒ директории проектов
Столкнулся с проблемой, когда логи nginx, которые попадают в директорию ./logs - создаются под root. Соответственно, если требуется их удалить - необходимо лезть в консоль для:
sudo rm *.log
docker-compose.yml
version: '3'
services:
#Php-fpm Service
app:
build:
context: ./docker/php/
dockerfile: php-fpm.docker
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./www:/var/www
- ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
links:
- db
networks:
- laravel-network
#Nginx Service
webserver:
build:
context: ./docker/nginx/
dockerfile: nginx.docker
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./www:/var/www
- ./hosts/:/etc/nginx/conf.d
- ./logs:/var/log/nginx
links:
- app
- db
networks:
- laravel-network
#MariaDB Service
db:
build:
context: ./docker/mysql/
dockerfile: mariadb.docker
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: secret
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./mysql:/var/lib/mysql/
- ./docker/mysql/my.cnf:/etc/mysql/my.cnf
networks:
- laravel-network
#PHPMyadmin Service
pma:
image: phpmyadmin:latest
container_name: pma
restart: unless-stopped
tty: true
ports:
- 81:80
environment:
PMA_HOST: db
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: secret
links:
- db
networks:
- laravel-network
#Docker Networks
networks:
laravel-network:
driver: bridge
Изначально была аналогичная проблема с MariaDB - все файлы создавались под root, пофиксил - запустив контейнер не от root пользователя.
Dockerfile для mariadb
FROM mariadb:latest
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
USER www
Такой же прием попробовал применить для контейнера Nginx, но возникла проблема.
Содержание Dockerfile для nginx
FROM nginx
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
USER www
В таком виде - nginx не стартует, ошибки:
webserver | 2020/10/28 07:09:25 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
webserver | nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
webserver | 2020/10/28 07:09:25 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
webserver | nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
Если попробовать выдать 777 на /var/cache/nginx/ (RUN chmod -R 777 /var/cache/nginx/), то появляется другая ошибка:
webserver | 2020/10/28 07:12:54 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
webserver | nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
webserver | 2020/10/28 07:12:54 [emerg] 1#1: bind() to 0.0.0.0:80 failed (13: Permission denied)
webserver | nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
Могу предположить - проблема связана с правами, но я не могу разобраться, как заставить nginx стартовать от имени созданного пользователя (www) или иным способом обойти проблему, то есть выдать на создаваемые логи полные права (или права www пользователя).
С докером познакомился "буквально вчера", поэтому может не вижу очевидного решения проблемы. Не подскажите, как пофиксить данную проблему или может посоветуете вариант получше?