我想在特定脚本/容器结束后启动服务。 特别是我想要启动“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是否实现了一个构造函数来检测服务是否结束
查看互联网、文档
此类设置的典型模式是入口点包装脚本。 您可以编写一个简短的 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