start / stop docker container on table start / stop

This commit is contained in:
iamBadgers
2026-03-28 00:11:12 -07:00
parent d9c9dad905
commit 97fb4546f9
4 changed files with 89 additions and 12 deletions

View File

@@ -1,7 +1,19 @@
black==26.3.1
blinker==1.9.0 blinker==1.9.0
certifi==2026.2.25
charset-normalizer==3.4.6
click==8.3.1 click==8.3.1
docker==7.1.0
Flask==3.1.3 Flask==3.1.3
idna==3.11
itsdangerous==2.2.0 itsdangerous==2.2.0
Jinja2==3.1.6 Jinja2==3.1.6
MarkupSafe==3.0.3 MarkupSafe==3.0.3
mypy_extensions==1.1.0
packaging==26.0
pathspec==1.0.4
platformdirs==4.9.4
pytokens==0.4.1
requests==2.33.0
urllib3==2.6.3
Werkzeug==3.1.6 Werkzeug==3.1.6

View File

@@ -0,0 +1,31 @@
import docker
def start_container(table_name, prefix):
client = docker.from_env()
router_key = "traefik.http.routers.{table_name}.rule".format(table_name=table_name)
middleware_key = (
"traefik.http.middlewares.{table_name}-stripprefix.stripprefix.prefixes".format(
table_name=table_name
)
)
middleware_router_key = "traefik.http.routers.{table_name}.middlewares".format(
table_name=table_name
)
labels = {}
labels[router_key] = "Host(`localhost`) && PathPrefix(`/{prefix}`)".format(prefix=prefix)
labels[middleware_key] = "/{prefix}".format(prefix=prefix)
labels[middleware_router_key] = "{table_name}-stripprefix".format(table_name=table_name)
container = client.containers.run(
image="crccheck/hello-world", detach=True, labels=labels, ports={8000:8000}
)
return container.id
def stop_container(docker_id):
client = docker.from_env()
container = client.containers.get(docker_id)
container.kill()

View File

@@ -3,6 +3,7 @@ class GameTable:
_game_table_name: str _game_table_name: str
_game_table_link: str _game_table_link: str
_active: bool _active: bool
_docker_id: str
_created: bool _created: bool
_updated: bool _updated: bool
@@ -12,6 +13,7 @@ class GameTable:
game_table_name: str, game_table_name: str,
game_table_link: str, game_table_link: str,
active: bool, active: bool,
docker_id: int,
created: bool = False, created: bool = False,
updated: bool = False, updated: bool = False,
): ):
@@ -19,6 +21,7 @@ class GameTable:
self._game_table_name = game_table_name self._game_table_name = game_table_name
self._game_table_link = game_table_link self._game_table_link = game_table_link
self._active = active self._active = active
self._docker_id = docker_id
self._created = created self._created = created
self._updated = updated self._updated = updated
@@ -30,17 +33,21 @@ class GameTable:
"active": self._active, "active": self._active,
} }
def commit(self, cursor): def commit(self, app, cursor):
app.logger.info(self._created)
app.logger.info(self._updated)
app.logger.info(self._docker_id)
if not self._created: if not self._created:
cursor.execute( cursor.execute(
"""INSERT INTO game_tables """INSERT INTO game_tables
(game_table_id, game_table_name, game_table_link, active) (game_table_id, game_table_name, game_table_link, active, docker_id)
VALUES (?, ?, ?, ?)""", VALUES (?, ?, ?, ?, ?)""",
( (
self._game_table_id, self._game_table_id,
self._game_table_name, self._game_table_name,
self._game_table_link, self._game_table_link,
self._active, self._active,
self._docker_id,
), ),
) )
self._created = True self._created = True
@@ -49,12 +56,13 @@ class GameTable:
if not self._updated: if not self._updated:
cursor.execute( cursor.execute(
"""UPDATE game_tables """UPDATE game_tables
SET game_table_name = ?, game_table_link = ?, active = ? SET game_table_name = ?, game_table_link = ?, active = ?, docker_id = ?
WHERE game_table_id = ?""", WHERE game_table_id = ?""",
( (
self._game_table_name, self._game_table_name,
self._game_table_link, self._game_table_link,
self._active, self._active,
self._docker_id,
self._game_table_id, self._game_table_id,
), ),
) )
@@ -70,6 +78,15 @@ class GameTable:
self._updated = False self._updated = False
self._game_table_id = game_table_id self._game_table_id = game_table_id
@property
def game_table_name(self):
return self._game_table_name
@game_table_name.setter
def game_table_name(self, game_table_name: str):
self._updated = False
self._game_table_name = game_table_name
@property @property
def active(self): def active(self):
return self._active return self._active
@@ -79,10 +96,19 @@ class GameTable:
self._updated = False self._updated = False
self._active = active self._active = active
@property
def docker_id(self):
return self._docker_id
@docker_id.setter
def docker_id(self, docker_id: int):
self._upadted = False
self._docker_id = docker_id
def read_by_id(game_table_id, cursor): def read_by_id(game_table_id, cursor):
rows = cursor.execute( rows = cursor.execute(
"""SELECT game_table_id, game_table_name, game_table_link, active """SELECT game_table_id, game_table_name, game_table_link, active, docker_id
FROM game_tables FROM game_tables
WHERE game_table_id = ?""", WHERE game_table_id = ?""",
(game_table_id,), (game_table_id,),
@@ -91,18 +117,18 @@ def read_by_id(game_table_id, cursor):
if len(rows) == 0: if len(rows) == 0:
return None return None
return GameTable(rows[0], rows[1], rows[2], rows[3], True, True) return GameTable(rows[0], rows[1], rows[2], rows[3], rows[4], True, True)
def read_all(cursor): def read_all(cursor):
rows = cursor.execute( rows = cursor.execute(
"SELECT game_table_id, game_table_name, game_table_link, active FROM game_tables" "SELECT game_table_id, game_table_name, game_table_link, active, docker_id FROM game_tables"
).fetchall() ).fetchall()
return [GameTable(row[0], row[1], row[2], row[3], True, True) for row in rows] return [GameTable(row[0], row[1], row[2], row[3], row[4], True, True) for row in rows]
def read_active(cursor): def read_active(cursor):
rows = cursor.execute( rows = cursor.execute(
"SELECT game_table_id, game_table_name, game_table_link, active FROM game_tables WHERE active != 0" "SELECT game_table_id, game_table_name, game_table_link, active, docker_id FROM game_tables WHERE active != 0"
).fetchall() ).fetchall()
return [GameTable(row[0], row[1], row[2], row[3], True, True) for row in rows] return [GameTable(row[0], row[1], row[2], row[3], row[4],True, True) for row in rows]

View File

@@ -2,6 +2,7 @@ from flask import Flask, g, jsonify, request
import sqlite3 import sqlite3
import game_tables import game_tables
import key_tables import key_tables
import container_managment
app = Flask(__name__) app = Flask(__name__)
@@ -82,8 +83,12 @@ def activate_table(table_id):
keys[0].reserve(table.game_table_id) keys[0].reserve(table.game_table_id)
table.active = True table.active = True
table.docker_id = container_managment.start_container(
table.game_table_name, "test_table_1"
)
app.logger.info(table.docker_id)
keys[0].commit(cursor) keys[0].commit(cursor)
table.commit(cursor) table.commit(app, cursor)
cursor.close() cursor.close()
db.commit() db.commit()
return jsonify(table.toJson()) return jsonify(table.toJson())
@@ -105,7 +110,10 @@ def deactivate_table(table_id):
key.release() key.release()
key.commit(cursor) key.commit(cursor)
table.commit(cursor) table.commit(app, cursor)
app.logger.info(table.docker_id)
container_managment.stop_container(table.docker_id)
cursor.close() cursor.close()
db.commit() db.commit()
return jsonify(table.toJson()) return jsonify(table.toJson())