@symnoob

Docker — как запустить Apache от имени пользователя?

Всем привет,
как только добовляю эту строку, Apache не стартует...
USER www-data

docker-compose ps -> state restarting

Dockerfile:
FROM httpd:2.4
RUN apt-get update && apt-get upgrade -y
RUN apt-get install nano -y
set default user and working directory
USER www-data
EXPOSE 80


docker-compose.yaml:
version: '3.7'

services:

  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  web:
    image: apache
    build: ./apache
    depends_on:
      - db
    restart: always
    ports:
      - 80:80
    volumes:
      - //c/Docker/sf4/project:/usr/local/apache2/htdocs


Использую Docker Toolbox
Хост-Система: Win10Home 64Bit
Пожалуйста, кто что знает, помогите
  • Вопрос задан
  • 666 просмотров
Пригласить эксперта
Ответы на вопрос 2
@metajiji
Вот если совсем в лоб, то:
docker run --help
docker run --user XXX


В принципе вы это сделали в Dockerfile, но подумайте головой... Вы взяли образ httpd, внутри огромный debian https://github.com/docker-library/httpd/blob/75e85...
Лучше для такой задачи взять alpine FROM httpd:alpine-2.4
Дальше httpd скорее всего запускается от рута, причем не просто так! Ему просто необходимо это сделать, потому, что существует такая вещь как не привилегированные порты https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D...

У вас 100500% в конфиге httpd указан порт 80, что меньше 1024, следовательно httpd не в силах запуститься!
httpd запускается от рута, биндится на 80/443 порт, после чего делает suid на uid/gid, указанного в кофниге https://httpd.apache.org/docs/2.4/mod/mod_unixd.ht...

Теперь зная это, становится понятно, почему в docker logs (имя_контейнера) мы видим ошибки.

Что делать? Ну например запускать апач от пользователя www-data, как и собирались, но на портах выше, чем 1024, а если хочется, чтобы он отвечал на 80 порту на хосте, то не вопрос, порт-маппинг сделает для вас это, потому, что на хосте dockerd запустит docker-proxy процесс, который будет работать от рута и будет слушать 80 порт, проксируя траффик в контейнер на указанный вами порт, например 8080.
Получаем, что внутри контейнера апач живет на 8080, снаружи на 80.

version: '3.7'

services:

  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  web:
    image: httpd:alpine-2.4  # поверьте, вам не нужен nano внутри контейнера! просто подключите все необходимые конфиги с хоста как volume, это правда удобно.
    depends_on:
      - db
    restart: always
    ports:
      - 80:8080  #HOST:CONTAINER
    volumes:
      - //c/Docker/sf4/project:/usr/local/apache2/htdocs
#      - скопируйте необходимые конфиги себе примерно так: "docker cp /etc/httpd/httpd.conf ." и подключите как volume
      - "./httpd/httpd.conf:/etc/httpd/httpd.conf"  # пример подключения конфига, где ./httpd/httpd.conf файл рядом с вашим docker-compose.yml
Ответ написан
inoise
@inoise
Solution Architect, AWS Certified, Serverless
А есть ли там пользователь www-data?) Да и вообще - зайдите в контейнер и почитайте логи. Делов-то
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы