Я пытаюсь развернуть контейнер докеров, и хотя я пробовал несколько вариантов, он всегда дает сбой. На локальном работает нормально, на порту 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.






Ответ прост, вы не можете привязаться к определенному порту, вы должны использовать переменную $ PORT env. Подробнее об этой ветке здесь.
Я наконец решил пойти с Google Cloud. Все работало как шарм.
Недавно я сам решил эту проблему здесь на случай, если вы когда-нибудь захотите снова попробовать 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}
Вы все еще используете эту установку? Похоже перестало работать. Я получаю: apache2: Syntax error on line 150 of /etc/apache2/apache2.conf: Could not open configuration file /etc/apache2/ports.conf: Permission denied
И перестала работать у меня. Смотрите мой новый ответ ниже @DamianPaszkowski
Принятый ответ @ 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
Пока работает нормально
Привет! Спасибо за Ваш ответ. Я пробовал разные варианты, но безуспешно. Я удалил: EXPOSE 80 и добавил: ENV PORT "$ PORT" EXPOSE $ {PORT}, но heroku по-прежнему сообщает мне ту же ошибку. :(