Я пытался создать контейнер со своим интерфейсом на Vue, но при создании он сразу закрывается и не запускается.
Здесь я показываю свой Dockerfile:
# compliation
FROM node:latest as build-stage
WORKDIR /app
COPY ./app/package*.json ./
RUN npm install
COPY ./app .
RUN npm run build
# production
FROM httpd:latest as production-stage
WORKDIR /usr/local/apache2/
COPY --from=build-stage /app/dist/ htdocs/
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf
RUN chown -R www-data:www-data /usr/local/apache2/htdocs /usr/local/apache2/logs /usr/local/apache2/conf
RUN chmod -R 755 /usr/local/apache2/logs
EXPOSE 80
CMD ["httpd-foreground"]
И мой файл docker-compose.yml:
services:
frontend:
build:
context: ./
dockerfile: Dockerfile.prod
image: myapp-frontend:latest
ports:
- "8080:80"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql-data:
driver: local
Конфигурация httpd:
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule log_config_module modules/mod_log_config.so
ServerName localhost
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
</Directory>
<IfModule mod_proxy.c>
ProxyPreserveHost On
ProxyPass /api http://backend:9000/api
ProxyPassReverse /api http://backend:9000/api
</IfModule>
ErrorLog /usr/local/apache2/logs/error.log
CustomLog /usr/local/apache2/logs/access.log combined
Как я уже говорил, при создании контейнера он завершается сразу после создания.
Я попытался создать контейнер вне папки, но возникла та же проблема; он выходит сразу после его создания.
Я покажу сообщение, которое появляется при попытке просмотреть журналы контейнера: > sudo docker logs frontend-frontend-1 нет доступных сокетов для прослушивания, выключение AH00015: невозможно открыть журналы
«Нет доступных сокетов для прослушивания» предполагает, что ошибка связана с отсутствием каких-либо директив Listen в вашей конфигурации Apache. Взгляните на содержимое файла httpd.conf по умолчанию, который вы заменяете.
@larsks Теперь я добавил «Прослушивать 80» в файл httpd.conf, но контейнер все равно завершает работу, но я не получаю никакого сообщения при показе журналов контейнера.


Причина, по которой вы не видите никаких журналов, даже несмотря на то, что httpd завершает работу с ошибкой, заключается в том, что вы явно сохраняете выходные данные журнала в файлах, а не позволяете httpd записывать в консоль:
ErrorLog /usr/local/apache2/logs/error.log
CustomLog /usr/local/apache2/logs/access.log combined
Если бы вы заменили это на:
ErrorLog /proc/self/fd/2
AccessLog /proc/self/fd/1
При запуске вы увидите:
Attaching to frontend-1
frontend-1 | AH00526: Syntax error on line 37 of /usr/local/apache2/conf/httpd.conf:
frontend-1 | CustomLog takes two or three arguments, a file name, a custom log format string or format name, and an optional "env = " or "expr = " clause (see docs)
frontend-1 exited with code 1
Вам необходимо исправить синтаксис директивы CustomLog. Я снова отсылаю вас к стандартной httpd.conf мухе, которую вы заменяете, которая имеет:
CustomLog /proc/self/fd/1 common
Исправление этого устранит синтаксическую ошибку. Однако ваш контейнер все равно не запустится; теперь вы увидите:
Attaching to frontend-1
frontend-1 | [Sun May 19 15:38:24.839602 2024] [core:crit] [pid 1:tid 140502081734528] AH00136: Server MUST relinquish startup privileges before accepting connections. Please ensure mod_unixd or other system security module is loaded.
frontend-1 | AH00016: Configuration Failed
frontend-1 exited with code 1
Вам нужно добавить:
LoadModule unixd_module modules/mod_unixd.so
...который, опять же, уже содержался в файле httpd.conf по умолчанию.
Со всеми этими изменениями контейнер запускается корректно (хотя и с парой предупреждений):
Attaching to frontend-1
frontend-1 | [Sun May 19 15:40:30.893752 2024] [mpm_event:notice] [pid 1:tid 139963380303744] AH00489: Apache/2.4.59 (Unix) configured -- resuming normal operations
frontend-1 | [Sun May 19 15:40:30.893950 2024] [core:notice] [pid 1:tid 139963380303744] AH00094: Command line: 'httpd -D FOREGROUND'
frontend-1 | [Sun May 19 15:40:30.894019 2024] [unixd:alert] [pid 9:tid 139963380303744] AH02155: getpwuid: couldn't determine user name from uid 4294967295, you probably need to modify the User directive
frontend-1 | [Sun May 19 15:40:30.894012 2024] [unixd:alert] [pid 8:tid 139963380303744] AH02155: getpwuid: couldn't determine user name from uid 4294967295, you probably need to modify the User directive
frontend-1 | [Sun May 19 15:40:30.894149 2024] [unixd:alert] [pid 10:tid 139963380303744] AH02155: getpwuid: couldn't determine user name from uid 4294967295, you probably need to modify the User directive
Большое спасибо!! Это была одна из проблем, другая заключалась в том, что имя сервера было установлено на localhost вместо localhost:80.
Что находится в журналах контейнера? Вы пытались удалить части конфигурации; Можете ли вы указать конкретную строку, которая вызывает проблемы?