我的目录中有以下两个文件:
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?
我的项目目录结构:
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) 根据https://github.com/krallin/tini#using-tini的说法,tini内置在docker中,可以通过将--init
标志传递给来使用docker run
。就我而言,我正在使用docker-compose,而不docker run
直接调用。如何传递此标志?
我试图从 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) 我有一个 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)
目前该脚本的唯一目的是测试所有功能。
docker ×5
dockerfile ×3
bash ×2
alpine-linux ×1
node.js ×1
shell ×1
sigint ×1
sigkill ×1
sigterm ×1