GNU / make и docker, завершить запущенный процесс - PullRequest
0 голосов
/ 21 ноября 2018

Я использую GNU / make (linux) для переноса некоторой команды docker, я не использую docker каждый день, поэтому скоро забуду об использовании, одна из этих оболочек - make serve, она запускается docker run сphp -S (встроенный сервер) в качестве команды, он запускается и прослушивает соединения.

Чтобы остановить его, я должен использовать ^ C , я считаю (но я не уверен)проблема в том, что make перехватывает сигнал, цель make терпит неудачу, но процесс php (и экземпляр docker) продолжает работать, я должен остановить его вручную.

Я попытался передать --sig-proxy=true и false но безрезультатно, но я запускаю экземпляр с псевдотерминалом (-t), так что это было ожидаемо.

Я написал оболочку bash для вывода некоторого сообщения, когда какой-то сигнал перехватывается (EXIT TERM SIGTERM SIGQUIT KILL SIGKILL) и exec php -S, но я не вижу ни одного сообщения.

Я не уверен, что произойдет, когда ^ C нажата на работающей модели, если сигнал (и что) распространяется только на разветвленную sh -c, и почему это не сработает с docker run.

Я хотел бы знать, если это таку кого-то еще была эта проблема и она решена, или если кто-то может придумать какое-нибудь альтернативное решение.

edit

Makefile:

all:

.PHONY: docker-build serve

docker-build:
    docker build -f Dockerfile -t sigtest:v1 .

serve:
    docker run -t --rm sigtest:v1 gosu ubuntu:ubuntu php7.0 -S 0.0.0.0:8081 -t /home/ubuntu

Dockerfile:

FROM ubuntu:16.04

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends php7.0-cli gosu 

RUN useradd -ms /bin/bash ubuntu

тест с make docker-build и затем make serve

2-е редактирование

Мне удалось обернуть docker run ссценарий оболочки (я не уверен насчет синтаксиса ловушек в оболочках posix, в конце концов посмотрю)

make, кажется, отправляет INT в первый раз иа затем EXIT

#!/bin/sh
pid=$$
trap 'trap - INT EXIT; echo " signal received, wait..."; docker stop -t 0 sig${pid}; exit' INT EXIT
docker run --name=sig${pid} "$@"

, а затем в Makefile

serve:
    -./docker-run.sh -t --rm sigtest:v1 gosu ubuntu:ubuntu php7.0 -S 0.0.0.0:8081 -t /home/ubuntu

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

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема не в использовании make, а в обработке сигнала.Вот статья , описывающая ее.

Как я уже говорил, docker-compose управляет всем жизненным циклом ваших услуг.

Вот базовый пример использования вашего приложения docker-compose.По make up и make down (включая ^C), чтобы вы могли запускать и останавливать свои услуги.Makefile:

all:

.PHONY: docker-build serve

build:
    docker-compose build

up:
    docker-compose up

down:
    docker-compose down

docker-compose.yml:

version: '3.3'

services:
  my_service:
    build: .
    ports:
    - "8080:8080"

Dockerfile:

FROM ubuntu:16.04

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends php7.0-cli gosu

RUN useradd -ms /bin/bash ubuntu

RUN mkdir -p /home/ubuntu
RUN php7.0 --version
ENTRYPOINT php7.0 -S 0.0.0.0:8080
...