我如何让机架在出口(sigterm)上执行代码?带架子的Startet

问题描述 投票:1回答:1

我有一个docker容器(以docker-compose开头),它运行一个简单的webrick webhost。如果我停止了Docker容器,我想执行一些代码来进行“清理”。

[我知道当您使用stop时,docker发送一个SIGTERM,但是我不确定docker-compose down是否也是如此。我正在使用docker-compose down停止它,一些代码应该可以使用它。该应用程序无意在生产环境中运行,因此无需担心;)

我以rackup --host 0.0.0.0 -p 80开头,我的config.ru(以下设置中的管理器)文件包含以下内容:

require_relative 'app/config/initializer'

run Manager.freeze.app

# What I need, but does not work.
at_exit do
  ConsoleManager.stop_all_services
end

旁注:

我需要进行清理,这个Docker容器启动了其他Docker容器,并且由于我共享docker套接字,所以它们基本上在我的机器上运行(或者至少我的Docker认为如此)。这对于这个有趣的项目是有好处的,因为它有助于通信(它们在同一个docker网络中),但是不利的是,如果管理器关闭,它们也不会关闭。这就是ConsoleManager.stop_all_services所做的。

编辑1:

我知道这不是理想的设置,并且确实对生产不利。我创建此设置的原因是可以尝试,现在我有更多的空闲时间。即使与问题本身无关(我如何让机架在出口(sigterm)上执行代码),我也将解释我的设置。

network

共享套接字来自Using Docker-in-Docker for your CI or testing environment?Docker in Docker?

Compose-file-1:

services:
  backend:
    build: ./backend
    volumes:
      - ./backend:/app
    depends_on:
      - database

  database:
    image: mariadb:10.0
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - database:/var/lib/mysql/

  manager:
    build:
      context: .
      dockerfile: Dockerfile-manager
    volumes:
      - ./manager:/app/manager
      - ./helper:/app/helper
      - ./manager/docker-compose.yml:/app/docker-compose.yml
      - /var/run/docker.sock:/var/run/docker.sock

  webserver:
    image: nginx:latest
    depends_on:
      - manager
      - backend
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/:delegated
    ports:
      - 80:80

volumes:
  database:

Compose-file-2:

services:
  helper:
    build:
      context: ./helper
      network: host

  chrome:
    image: selenium/standalone-chrome-debug:3.0.1-germanium
    logging:
      driver: none
    stdin_open: true
    tty: true

networks:
  default:
    external:
      name: practice-project_default

管理器是一个简单的Web服务,具有2条路径,一条开始,一条停止。这是我所质疑的。如果停止,则需要停止所有产生的撰写过程和容器。如您所见,撰写过程将在管理器上运行,但是容器本身不在。经理用来启动和停止的基本代码。

class ConsoleManager
  def self.start(name)
    name = name.slugify
    helpers[name] = new(name).start

    response
  end

  def self.stop(name)
    helpers[name].delete.stop

    response
  end

  def self.stop_all
    helpers.keys { |key| helpers[key].stop }
  end

  def self.response
    'Currently running: ' + helpers.keys.join(', ')
  end

  def self.helpers
    @helpers ||= {}
  end

  def initialize(name)
    @name = name
  end

  def start
    exec 'up -d'
  end

  def stop
    exec 'down'
  end

  private

  def exec(command)
    system("docker-compose -f /app/docker-compose.yml -p #{@name} #{command}")
  end
end

正如我说的那样,对于生产环境来说,设置是not

,并且不应认为是最佳/最佳设置。另外,问题本身是irrelevant。由于如果服务停止,您还可能想做其他事情,例如:
  • 从可能的服务列表中注销Web服务器
  • 发送电子邮件
  • 任何你喜欢
  • 因此,请专注于问题而不是设置。即使我愿意接受有关设置的建议,但如果它不能回答主要问题,我也不能接受您的回答。

我有一个docker容器(以docker-compose开头),它运行一个简单的webrick webhost。如果我停止了Docker容器,我想执行一些代码来进行“清理”。我知道docker发送了一个...

ruby docker docker-compose rack sigterm
1个回答
0
投票

这不是我真正的问题(机架出口)的答案,但是由于它可以为其他在此处遇到命名docker问题的人提供解决方案,因此我决定对此进行记录。

© www.soinside.com 2019 - 2024. All rights reserved.