相关疑难解决方法(0)

Docker bash shell 脚本无法捕获 SIGINT 或 SIGTERM

我的目录中有以下两个文件:

Dockerfile

FROM debian

WORKDIR /app
COPY start.sh /app/

CMD ["/app/start.sh"]
Run Code Online (Sandbox Code Playgroud)

start.sh(使用权限 755 chmod +x start.sh

FROM debian

WORKDIR /app
COPY start.sh /app/

CMD ["/app/start.sh"]
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令:

$ docker build . -t tmp
$ docker run --name tmp tmp
Run Code Online (Sandbox Code Playgroud)

然后我期望按 Ctrl+C 会向程序发送 SIGINT,该程序会将 SIGINT 打印到屏幕然后退出,但这并没有发生。

我还尝试运行$ docker stop tmp,我希望它会向程序发送一个 SIGTERM ,但$ docker logs tmp之后检查显示 SIGTERM 未被捕获。

为什么 bash 脚本没有捕获 SIGINT 和 SIGTERM?

bash shell sigint sigterm docker

15
推荐指数
2
解决办法
1万
查看次数

Docker Compose:在 $PATH 中找不到可执行文件:未知

我的项目目录结构:

myapp/
    src/
    Dockerfile
    docker-compose.yml
    docker-deploy.sh
    wait-for-it.sh
    .env
Run Code Online (Sandbox Code Playgroud)

wait-for-it.sh著名的等待脚本的副本在哪里?

我的Dockerfile

FROM node:16

WORKDIR /usr/src/app

COPY package*.json ./
COPY wait-for-it.sh ./
COPY docker-deploy.sh ./

RUN chmod +x docker-deploy.sh

RUN npm install --legacy-peer-deps

COPY . .

RUN npm run build

ENTRYPOINT ["docker-deploy.sh"]
Run Code Online (Sandbox Code Playgroud)

并且docker-deploy.sh是:

#!/bin/bash

# make wait-for-it executable
chmod +x wait-for-it.sh

# call wait-for-it with passed in args and then start node if it succeeds
bash wait-for-it.sh -h $1 -p $2 -t 300 -s -- …
Run Code Online (Sandbox Code Playgroud)

node.js docker dockerfile docker-compose

9
推荐指数
1
解决办法
1万
查看次数

与docker run --init等效的docker-compose是什么?

根据https://github.com/krallin/tini#using-tini的说法,tini内置在docker中,可以通过将--init标志传递给来使用docker run。就我而言,我正在使用docker-compose,而不docker run直接调用。如何传递此标志?

docker docker-compose

8
推荐指数
2
解决办法
2877
查看次数

从高山图像中捕获 SIGTERM

我试图从 docker 实例捕获 SIGTERM 信号(基本上是在调用 docker stop 时),但找不到方法,因为我执行的每次尝试都有不同的结果。

以下是我的设置

Dockerfile

FROM gitlab/gitlab-runner:alpine

COPY ./start.sh /start.sh

ENTRYPOINT ["/start.sh"]
Run Code Online (Sandbox Code Playgroud)

启动文件

FROM gitlab/gitlab-runner:alpine

COPY ./start.sh /start.sh

ENTRYPOINT ["/start.sh"]
Run Code Online (Sandbox Code Playgroud)

现在我构建 docker 镜像

$ docker build -t dockertrapcatch .
Sending build context to Docker daemon  51.71kB
Step 1/3 : FROM gitlab/gitlab-runner:alpine
 ---> 9f8c39873bee
Step 2/3 : COPY ./start.sh /start.sh
 ---> Using cache
 ---> ebb3cac0c509
Step 3/3 : ENTRYPOINT ["/start.sh"]
 ---> Using cache
 ---> 7ab67fe5a714
Successfully built 7ab67fe5a714
Successfully tagged dockertrapcatch:latest
Run Code Online (Sandbox Code Playgroud)

运行泊坞窗

#!/bin/bash

deregister_runner() {
    echo …
Run Code Online (Sandbox Code Playgroud)

sigkill docker dockerfile gitlab-ci-runner alpine-linux

5
推荐指数
1
解决办法
6241
查看次数

Docker运行脚本捕获中断信号

我有一个 docker-compose.yml 启动多个容器。其中之一使用 Dockerimage 文件来安装该容器中所需的所有内容。

我想添加一个每次等待中断信号 0、9 和 137 时运行的脚本。

现在,我尝试将脚本作为 Dockerimage 文件中的入口点运行,但似乎不起作用。

这是 Dockerimage 文件的内容:

RUN apt-get update && [...]
WORKDIR "/application"
ENTRYPOINT ["/bin/bash", "-c", "/application/scripts/cl.sh"] 
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我需要使用以下命令重建容器吗?

docker-compose build
Run Code Online (Sandbox Code Playgroud)

这是bash脚本cl.sh的内容

#!/bin/bash

echo "HELLO HELLO HELLO HELLO"

trap 'echo "Exiting with a 137 signal."' 137 0 9
Run Code Online (Sandbox Code Playgroud)

目前该脚本的唯一目的是测试所有功能。

bash docker dockerfile docker-compose

4
推荐指数
1
解决办法
4751
查看次数