Как запустить команду при запуске контейнера - Docker - PullRequest
0 голосов
/ 20 декабря 2018

Вот файл Docker:

FROM nginx:stable-alpine

COPY ./mailservice /var/www/backend
COPY ./dist /usr/share/nginx/html
COPY ./docker/nginx_config/default.conf /etc/nginx/conf.d/default.conf
COPY ./docker/nginx_config/.htpasswd /etc/nginx

RUN chown -R nginx:nginx /usr/share/nginx/html/ \
    && chown -R nginx:nginx /etc/nginx/.htpasswd \
    && apk add --update nodejs nodejs-npm

WORKDIR /var/www/backend
RUN npm run start

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Но мой RUN npm run start не работает, я должен вручную прикрепить оболочку к контейнеру, а затем запустить его самостоятельно.Как правильно запустить npm run start после запуска контейнера?

ОБНОВЛЕНИЕ

CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["node", "server.js"]

Будет ли это работать?

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018
  • Ваш нынешний подход в корне неверен по дизайну.
  • Ваш текущий подход является явным анти-паттерном использования контейнеров
  • Пожалуйста, создайте файл Docker для своего приложения
  • Пожалуйста, создайте Dockerfile для nginx отдельно
  • Используйте docker-compose для построения стека или вы можете создать его по-своему
  • Всегда запускать приложение и прокси в отдельных контейнерах
0 голосов
/ 20 декабря 2018

В рекомендациях говорится, что вы не должны запускать более одного процесса на контейнер.Если ваше приложение не выполнено способом, который запускает множественные процессы с уникальной точки входа .

Но есть некоторый обходной путь, который вы можете использовать.Попробуйте проверить этот вопрос: Несколько точек входа Docker

0 голосов
/ 20 декабря 2018

Вы путаете время сборки (в основном RUN инструкции) со временем выполнения (ENTRYPOINT или CMD) и после этого нарушаете правило: один контейнер, один процесс, даже если это не священный.

Я предлагаю использовать Supervisord с этой конфигурацией

[unix_http_server]
file=/tmp/supervisor.sock                       ; path to your socket file

[supervisord]
logfile=/var/log/supervisord/supervisord.log    ; supervisord log file
loglevel=error                                  ; info, debug, warn, trace
pidfile=/var/run/supervisord.pid                ; pidfile location
nodaemon=false                                  ; run supervisord as a daemon
minfds=1024                                     ; number of startup file descriptors
minprocs=200                                    ; number of process descriptors
user=root                                       ; default user
childlogdir=/var/log/supervisord/               ; where child log files will live

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock         ; use a unix:// URL  for a unix socket

[program:npm]
command=npm run --prefix /path/to/app start
stderr_logfile = /dev/stdout
stdout_logfile = /dev/stderr

[program:nginx]
command=nginx -g "daemon off;"
stderr_logfile = /dev/stdout
stdout_logfile = /dev/stderr

В этой конфигурации вы будете перенаправлять журналы на стандартный вывод, и это хорошая практика, а не файлы внутри контейнера, которые могут бытьэфемерно, также у вас будет PID, отвечающий за обработку дочерних процессов и перезапуск их с определенными правилами.

Вы можете попытаться добиться этого также с помощью скрипта bash, но это может быть сложно.

Еще один лучшийрешение должно заключаться в использовании отдельного контейнера с сетевым пространством имен для пересылки запросов NGINX восходящему потоку NPM ... но без Kubernetes его вряд ли можно поддерживать, даже если это не просто с помощью Docker:)

0 голосов
/ 20 декабря 2018

Решено следующим образом:

Dockerfile

FROM nginx:stable-alpine

COPY ./mailservice /var/www/backend
COPY ./dist /usr/share/nginx/html
COPY ./docker/nginx_config/default.conf /etc/nginx/conf.d/default.conf
COPY ./docker/nginx_config/.htpasswd /etc/nginx

RUN chown -R nginx:nginx /usr/share/nginx/html/ \
    && chown -R nginx:nginx /etc/nginx/.htpasswd \
    && apk add --update nodejs nodejs-npm

ADD ./docker/docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod 755 /docker-entrypoint.sh

EXPOSE 80

WORKDIR /

CMD ["/docker-entrypoint.sh"]

docker-entrypoint.sh

#!/usr/bin/env sh

exec node /var/www/backend/server.js > /var/log/node-server.log &
exec /usr/sbin/nginx -g "daemon off;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...