Я использую 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
я надеялся не называть экземпляры, но это самый простой способ, который я могу придумать.