Docker 编写如何在服务终止后启动服务

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

我想在特定脚本/容器结束后启动服务。 特别是我想要启动“app”容器,它将执行他的工作人员,该容器将执行一个 python 脚本。该服务完成后,我希望另一个容器能够启动,他的名字是“Benthos”。 特别是我希望在 python 脚本执行结束时启动 Benthos 服务。 Docker 组合

services:
  app:
    build: 
      context: .
      dockerfile: ./Dockerfile.python
    volumes:
      - ./src:/app/
    container_name: python-container
    depends_on:
      database:
        condition: service_healthy

  benthos:
    build:
     context: .
     dockerfile: ./Dockerfile.benthos  
    ports:
      - 8010:4195
    volumes:
      - ./src:/src/
    container_name: benthos-container
    stdin_open: true
    tty: true
    depends_on:
      database:
        condition: service_healthy

  database:
    image: cassandra:latest
    ports:
      - 9042:9042
    container_name: cassandra-container
    healthcheck:
      test: ["CMD-SHELL", "cqlsh -u cassandra -p cassandra -e 'DESCRIBE KEYSPACES'"]
      interval: 30s
      timeout: 10s
      retries: 5

我会在底栖服务中添加另一个

depends_on:
  app:
    condition: srvice_terminate

服务应用程序是一个简单的Python服务,它执行一个脚本,它是: db.py

from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement

def create_keyspace_and_table(session):
    keyspace_query = """
    CREATE KEYSPACE IF NOT EXISTS store WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}
    """
    session.execute(keyspace_query)

    session.set_keyspace('store')

    create_table = """
    CREATE TABLE IF NOT EXISTS store.mytable (
        id UUID PRIMARY KEY,
        message TEXT
    )
    """
    session.execute(create_table)

def insert_data(session, message):
    insert_query = """
    INSERT INTO store.mytable (id, message) VALUES (uuid(), %s)
    """
    session.execute(insert_query, (message,))

def print_data(session):
    select_query = "SELECT * FROM store.mytable"
    rows = session.execute(select_query)

    for row in rows:
        print(f"ID: {row.id}, Message: {row.message}")

def delete_all(session):
    delete_query = "TRUNCATE store.mytable"
    session.execute(delete_query)

if __name__ == "__main__":
    
    cluster = Cluster(['database']) 
    session = cluster.connect()

    try:
        create_keyspace_and_table(session)

        data = [
            ("Ciao sono il primo"),
            ("Ciao sono il secondo"),
            ("Ciao sono il terzo")
        ]

        print("insert values")
        for message in data:
            insert_data(session, message)

        print_data(session)
        
    finally:
        print("finish")

我想在Python脚本的执行通过时启动另一个服务

print_data(sesion)

我没有发现docker是否实现了一个构造函数来检测服务是否结束

查看互联网、文档

python docker docker-compose
1个回答
0
投票

此类设置的典型模式是入口点包装脚本。 您可以编写一个简短的 shell 脚本来执行任何所需的首次设置,在您的情况下运行迁移脚本,然后切换到主容器命令

#!/bin/sh

./seed_database.py || exit 1

exec "$@"

您将只有一个容器、一个映像和一个 Dockerfile。 将此包装器脚本设置为图像的

ENTRYPOINT
,并保持现有的
CMD
不变。 (如果您当前的主容器命令为
ENTRYPOINT
,请将其更改为
CMD
。)

COPY seed_database.py entrypoint.sh ./
ENTRYPOINT ["./entrypoint.sh"]
CMD ["benthos", "..."]

由于您的种子脚本是用 Python 编写的,但看起来 Benthos 核心是用 Go 编写的,因此您可能需要安装 Python 运行时才能运行它。

在 Compose 文件中,您可以摆脱短暂的种子作业,只拥有单个容器及其数据存储。

version: '3.8'
services:
  benthos:
    build: .
    ports:
      - 8010:4195
    depends_on:
      database:
        condition: service_healthy
  database:
    image: cassandra:latest
    # and the rest of this service from the original question
© www.soinside.com 2019 - 2024. All rights reserved.