我有一个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)上执行代码),我也将解释我的设置。
共享套接字来自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条路径,一条开始,一条停止。这是我所质疑的。如果停止,则需要停止所有产生的撰写过程和容器。如您所见,撰写过程将在管理器上运行,但是容器本身不在。经理用来启动和停止的基本代码。
,并且不应认为是最佳/最佳设置。另外,问题本身是irrelevant。由于如果服务停止,您还可能想做其他事情,例如: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
因此,请专注于问题而不是设置。即使我愿意接受有关设置的建议,但如果它不能回答主要问题,我也不能接受您的回答。
我有一个docker容器(以docker-compose开头),它运行一个简单的webrick webhost。如果我停止了Docker容器,我想执行一些代码来进行“清理”。我知道docker发送了一个...
这不是我真正的问题(机架出口)的答案,但是由于它可以为其他在此处遇到命名docker问题的人提供解决方案,因此我决定对此进行记录。