从父进程发送到子进程的信号在 docker 容器中被忽略
Signals sent to the child process from a parent process is ignored inside a docker container
我有一个使用 FastAPI 构建的 Python REST API 服务器。根据响应,它会生成一个 ffmpeg 子进程,用于从 IP 摄像机提供的 RTSP 流中捕获视频。根据另一个请求,应用程序通过向 ffmpeg 进程发送 SIGTERM 信号来停止录制视频。
这在 Docker 之外工作得很好,但在容器中,ffmpeg 进程会忽略 SIGTERM,因此视频永远不会停止录制。我尝试将 --init
选项添加到我的容器,但它没有帮助,尽管我的应用程序不再有 PID 1。
我的Docker文件:
# convert poetry's pyproject.toml into a requirements.txt file
FROM python:3.9 as requirements-stage
WORKDIR /tmp
RUN pip install poetry
COPY ./pyproject.toml ./poetry.lock* /tmp/
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# actual app deployment
FROM python:3.9
RUN apt update && apt install -y usbutils zlib1g libjpeg-dev ffmpeg
WORKDIR /
COPY --from=requirements-stage /tmp/requirements.txt /requirements.txt
RUN pip install --no-cache-dir --upgrade -r /requirements.txt
COPY . /
ENV IS_DOCKERIZED true
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
我的docker-compose.yml:
version: "3.7"
services:
ipfs_node:
image: ipfs/go-ipfs:v0.8.0
volumes:
- ~/ipfs/ipfs_staging:/export
- ~/ipfs/ipfs_data:/data/ipfs
ports:
- "5001:5001"
- "8080:8080"
- "4001:4001"
feecc_io_gateway:
build:
context: ./
dockerfile: Dockerfile
init: true
network_mode: "host"
volumes:
- "./output:/output"
- "/dev/usb:/dev/usb"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
当我试图解决这个问题时,我在 Docker 论坛上创建了另一个 topic。
我们无法使用信号使其工作,但我找到了解决方法。在我使用 ffmpeg 的情况下,我可以将“Q”键发送到标准输入,而不是向进程发送 SIGTERM / SIGINT 信号。这对我有用。
我有一个使用 FastAPI 构建的 Python REST API 服务器。根据响应,它会生成一个 ffmpeg 子进程,用于从 IP 摄像机提供的 RTSP 流中捕获视频。根据另一个请求,应用程序通过向 ffmpeg 进程发送 SIGTERM 信号来停止录制视频。
这在 Docker 之外工作得很好,但在容器中,ffmpeg 进程会忽略 SIGTERM,因此视频永远不会停止录制。我尝试将 --init
选项添加到我的容器,但它没有帮助,尽管我的应用程序不再有 PID 1。
我的Docker文件:
# convert poetry's pyproject.toml into a requirements.txt file
FROM python:3.9 as requirements-stage
WORKDIR /tmp
RUN pip install poetry
COPY ./pyproject.toml ./poetry.lock* /tmp/
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# actual app deployment
FROM python:3.9
RUN apt update && apt install -y usbutils zlib1g libjpeg-dev ffmpeg
WORKDIR /
COPY --from=requirements-stage /tmp/requirements.txt /requirements.txt
RUN pip install --no-cache-dir --upgrade -r /requirements.txt
COPY . /
ENV IS_DOCKERIZED true
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
我的docker-compose.yml:
version: "3.7"
services:
ipfs_node:
image: ipfs/go-ipfs:v0.8.0
volumes:
- ~/ipfs/ipfs_staging:/export
- ~/ipfs/ipfs_data:/data/ipfs
ports:
- "5001:5001"
- "8080:8080"
- "4001:4001"
feecc_io_gateway:
build:
context: ./
dockerfile: Dockerfile
init: true
network_mode: "host"
volumes:
- "./output:/output"
- "/dev/usb:/dev/usb"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
当我试图解决这个问题时,我在 Docker 论坛上创建了另一个 topic。
我们无法使用信号使其工作,但我找到了解决方法。在我使用 ffmpeg 的情况下,我可以将“Q”键发送到标准输入,而不是向进程发送 SIGTERM / SIGINT 信号。这对我有用。