Контейнер Frontend Docker вышел после создания и не работает

Я пытался создать контейнер со своим интерфейсом на 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

Как я уже говорил, при создании контейнера он завершается сразу после создания.

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

Что находится в журналах контейнера? Вы пытались удалить части конфигурации; Можете ли вы указать конкретную строку, которая вызывает проблемы?

David Maze 19.05.2024 13:33

Я покажу сообщение, которое появляется при попытке просмотреть журналы контейнера: > sudo docker logs frontend-frontend-1 нет доступных сокетов для прослушивания, выключение AH00015: невозможно открыть журналы

pol 19.05.2024 13:37

«Нет доступных сокетов для прослушивания» предполагает, что ошибка связана с отсутствием каких-либо директив Listen в вашей конфигурации Apache. Взгляните на содержимое файла httpd.conf по умолчанию, который вы заменяете.

larsks 19.05.2024 14:57

@larsks Теперь я добавил «Прослушивать 80» в файл httpd.conf, но контейнер все равно завершает работу, но я не получаю никакого сообщения при показе журналов контейнера.

pol 19.05.2024 17:20
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина, по которой вы не видите никаких журналов, даже несмотря на то, что 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.

pol 19.05.2024 17:56

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