簡體   English   中英

當 docker-compose 退出時運行可執行文件

[英]Running an executable when the docker-compose exits

我正在嘗試在 docker 容器退出時使用 nodejs 執行 javascript 文件。 這是我到目前為止所得到的,我的Dockerfile內容如下所示。 我無法在退出期間捕獲SIGINT信號,因此無法運行int_handler()函數。 我在下面提供的腳本中是否有任何問題?

我運行命令docker-compose up來啟動服務器,然后CTRL + C退出。

FROM node:10.16.0-slim

ENV NPM_CONFIG_PREFIX=/home/node/.npm-global

ENV PATH=$PATH:/home/node/.npm-global/bin

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

RUN mkdir -p /home/node/app/logs && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

EXPOSE 8523

COPY ./docker-script.sh ./docker-script.sh

ENTRYPOINT ["./docker-script.sh"]

docker-script.sh文件的內容如下所示:

#!/bin/bash
set -x

pid=0

int_handler() {
  echo "handler"
  node deactivator & pid="$!"
}

# setup handlers
trap 'kill ${!}; int_handler' SIGINT

# run application
node server & pid="$!"

# wait forever
while true
do
  tail -f /dev/null & wait ${!}
done

我的 docker-compose.yml 文件

version: '3'
services:
  mongo:
    image: mongo:3.6
  web:
    image: myimage/imagexyz:0.9.1
    restart: always
    ports:
     - "80:8081"
     - "443:8524"
    links:
     - mongo 
    depends_on: 
     - mongo

這件事有幾個小細節。

最重要的是,當您將Ctrl + C發送到前台docker-compose up ,它相當於docker-compose stop ,而后者相當於docker stop 這會發送SIGTERM ,而不是SIGINT 改變trap線以捕捉正確的信號會有所幫助。

在試驗中,一旦您發送了Ctrl + Cdocker-compose up將停止打印容器輸出。 它仍然會生成,但您仍然可以使用docker-compose logs web看到它。

這個腳本似乎在后台運行了很多它不需要的東西,另外一件事是你的int_handler函數在容器即將退出時啟動了一個后台進程。 這也具有運行tail -f “保持容器處於活動狀態”的反模式,而您的應用程序正在作為一種副作用運行。

我從你的腳本修改中得到了合理的行為:

#!/bin/sh

int_handler() {
  echo "int_handler"
  # node deactivator

  # forcibly exit the script (and the container)
  exit 0
}

# trap SIGTERM here, not SIGINT
trap int_handler SIGTERM

echo start

# run the CMD from the Dockerfile or the `docker run` command
"$@" &

# wait for that process to exit
# (don't start an artificial `tail -f`)
# (you must `wait` or else the signal is delayed until
# the process exits on its own)
wait $!

還有一個匹配的瑣碎Dockerfile

FROM alpine
COPY script /
ENTRYPOINT ["/script"]
CMD ["sleep", "15"]

如果trap函數沒有exit ,則在最終wait之后入口點腳本中的任何內容都將執行。 如果你想無條件清理,你可以使用它。 即使您docker stop容器,此變體也始終打印stop ,並以腳本的退出狀態退出。

#!/bin/sh
trap 'kill $pid' SIGTERM
echo start
"$@" &
pid=$!
wait $pid
rc=$?
echo stop
exit $rc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM