Docker контейнер работает и работает - PullRequest
0 голосов
/ 07 июня 2019

У меня не получается понять, как работает докер-контейнер. Из того, что я знаю, если в контейнере нет активных процессов, он автоматически отключается независимо от данных команд.

Вот почему я приказал своему docker-compose.yml выполнить эту команду, которая поддерживает ее:

  gateway:
    build: .
    image: me/gateway
    container_name: gateway
    command: tail -F /dev/null <------
    #    restart: always
    ports:
      - "10091:10091"
    volumes:
      - ./logs:/root/logs
      - vendor:/root/vendor
      - .:/root
    env_file:
      - .env 

Пока мой Dockerfile делает следующее:

FROM php:7-fpm-alpine

EXPOSE 10091

WORKDIR /root
COPY . .
COPY src/scripts/generateConfig.sh /usr/local/bin/generateConfig
RUN ["chmod", "+x", "/usr/local/bin/generateConfig"]

В этом сценарии контейнер остается, и все в порядке. Однако я хотел бы запустить скрипт после запуска контейнера, поэтому я добавил дополнительную строку в конец моего Dockerfile:

ENTRYPOINT ["generateConfig"]

После выполнения команды контейнер автоматически останавливается. Когда я проверяю журнал, ошибок нет, так как скрипт выполняет свою работу так, как должен. Скрипт отвечает за бесконечный запуск процесса веб-сокета Ratchet.

Как я могу заставить скрипт работать и одновременно поддерживать работу моего контейнера?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Я нашел проблему. Сценарий, который был в команде для запуска процесса веб-сокета, имел следующую строку, начинающую его:

nohup php ${serviceProcess} >> /dev/null 2>&1 &

Решением было не подавить вывод, используя только:

nohup php ${serviceProcess}

Теперь хорошо работает

0 голосов
/ 07 июня 2019

Когда вы запускаете контейнер, он запускает команду, определенную вами в ENTRYPOINT или CMD.Эта команда обычно запускает процесс, и пока этот процесс выполняется на переднем плане, контейнер все равно будет работать.Если ваш процесс запущен в фоновом режиме, контейнер остановится.Таким образом, если вы запускаете скрипт, вам нужно убедиться, что он никогда не заканчивается.Вы можете просто достичь этого, добавив такую ​​строку в конец вашего скрипта:

tail -f <some log file> # keep listening on your application log file.

В качестве альтернативы, вы можете добавить некоторое время, пока true:

while true; sleep 2; done 

Надеюсь, это поможет

...