Развертывание Docker PHP + Apache на Heroku дает сбой

Я пытаюсь развернуть контейнер докеров, и хотя я пробовал несколько вариантов, он всегда дает сбой. На локальном работает нормально, на порту 8080.

Сейчас я использую PHP + Apache.

Моя папка-иерархия выглядит так:

docker-compose.yml
Dockerfile 
www
   .htaccess
   index.php

Мой Dockerfile таков:

FROM php:7.1-apache
COPY www /var/www/html
RUN a2enmod rewrite
RUN a2enmod lbmethod_byrequests
RUN service apache2 restart
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Мой docker-composer.yml:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    image: myproject
    ports:
      - 8080:80

И .htaccess:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

Когда я проверяю журналы Heroku (журналы heroku --tail), я вижу следующее:

Starting process with command `/usr/sbin/apache2ctl -D FOREGROUND`
State changed from starting to crashed
Process exited with status 1
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(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
Action '-D FOREGROUND' failed.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
2 036
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ прост, вы не можете привязаться к определенному порту, вы должны использовать переменную $ PORT env. Подробнее об этой ветке здесь.

Привет! Спасибо за Ваш ответ. Я пробовал разные варианты, но безуспешно. Я удалил: EXPOSE 80 и добавил: ENV PORT "$ PORT" EXPOSE $ {PORT}, но heroku по-прежнему сообщает мне ту же ошибку. :(

anexo 26.12.2018 13:08

Я наконец решил пойти с Google Cloud. Все работало как шарм.

anexo 26.12.2018 21:01
Ответ принят как подходящий

Недавно я сам решил эту проблему здесь на случай, если вы когда-нибудь захотите снова попробовать Heroku :)

По сути, я использовал оператор Docker CMD для изменения конфигураций портов apache во время выполнения.

CMD sed -i "s/80/$PORT/g" /etc/apache2/sites-enabled/000-default.conf /etc/apache2/ports.conf && docker-php-entrypoint apache2-foreground

Вы также можете использовать ${PORT} внутри файлов 000-default.conf и ports.conf. например, Listen ${PORT}

Soviut 20.07.2019 09:31

Вы все еще используете эту установку? Похоже перестало работать. Я получаю: apache2: Syntax error on line 150 of /etc/apache2/apache2.conf: Could not open configuration file /etc/apache2/ports.conf: Permission denied

Damian Paszkowski 26.09.2019 09:36

И перестала работать у меня. Смотрите мой новый ответ ниже @DamianPaszkowski

perelin 01.10.2019 15:25

Принятый ответ @ caleb-gray перестал работать для меня в сентябре 2019 года, но я придумал альтернативное решение:

Вместо того, чтобы заменять значения портов в Dockerfile, я заменил их в исходных файлах apache2 .conf на переменные env, а затем скопировал их в образ Docker. Это также означает, что файлы .conf теперь являются частью моего репозитория (я скопировал их из работающего контейнера Docker).

Моя иерархия папок:

Dockerfile
apache-config/
  ports.conf
  000-default.conf

Например, в моем файле ports.conf строка

Listen 80

изменен на

Listen ${PORT}

И в моем Dockerfile:

COPY ./apache-config/ports.conf /etc/apache2/ports.conf                                
COPY ./apache-config/000-default.conf /etc/apache2/sites-available/000-default.conf    
CMD docker-php-entrypoint apache2-foreground

Пока работает нормально

Другие вопросы по теме