Docker -компонент не может запустить apache сервер - PullRequest
0 голосов
/ 14 марта 2020

Когда я запускаю sudo docker-compose up внутри моего каталога, я получаю эту ошибку. Я пытаюсь создать контейнер, на котором размещается веб-сайт php, где вы можете делать whoami на нем. Спасибо

(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
| no listening sockets available, shutting down
| AH00015: Unable to open logs

Dockerfile:

FROM ubuntu:16.04

RUN apt update

RUN apt install -y apache2 php libapache2-mod-php 

RUN useradd -d /home/cp/ -m -s /bin/nologin cp

WORKDIR /home/cp

COPY source .

USER cp

ENTRYPOINT service apache2 start && /bin/bash

docker -compose.yml

version: '2'

services:
   filebrowser:
        build: .
        ports:
            - '8000:80'
        stdin_open: true
        tty: true
        volumes:
            - ./source:/var/www/html
            - ./logs:/var/log/apache2

1 Ответ

1 голос
/ 14 марта 2020

В операционных системах, подобных Unix, существует давнее общее правило, согласно которому только пользователь root может открывать "низкие" порты 0-1023. Поскольку вы пытаетесь запустить Apache на стандартном HTTP-порте 80, но вы используете его как пользователь, не являющийся root, вы получаете сообщение об ошибке «Отказано в доступе».

Абсолютно самый простой ответ здесь - использовать предварительно созданное изображение с предварительно установленными PHP и Apache. Docker Hub php image включает в себя вариант этого. Вы можете использовать более простой Dockerfile:

FROM php:7.4-apache
# Has Apache, mod-php preinstalled and a correct CMD already,
# so the only thing you need to do is
COPY source /var/www/html

# If you want to run as a non-root user, you can specify
RUN useradd -r -U cp
ENV APACHE_RUN_USER cp
ENV APACHE_RUN_GROUP cp

С соответствующими docker-compose.yml

version: '3' # version 2 vs 3 doesn't really matter
services:
  filebrowser:
    build: .
    ports:
      - '8000:80'
    volumes:
      - ./logs:/var/log/apache2

Если вы хотите создать вещи с нуля, следующим самым простым вариантом будет Apache Пользовательская директива : ваш контейнер должен начинаться с root (чтобы он мог связываться с портом 80), а затем дать команду Apache переключиться на непривилегированного пользователя после его запуска. Стандартное изображение php:...-apache имеет возможность сделать это самостоятельно, что я показал выше.

...