volume support. add in subvols, too.
This commit is contained in:
@@ -3,7 +3,7 @@ blinker==1.9.0
|
|||||||
certifi==2026.2.25
|
certifi==2026.2.25
|
||||||
charset-normalizer==3.4.6
|
charset-normalizer==3.4.6
|
||||||
click==8.3.1
|
click==8.3.1
|
||||||
docker==7.1.0
|
docker @ git+https://github.com/docker/docker-py@main
|
||||||
Flask==3.1.3
|
Flask==3.1.3
|
||||||
idna==3.11
|
idna==3.11
|
||||||
itsdangerous==2.2.0
|
itsdangerous==2.2.0
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ from flask import current_app
|
|||||||
|
|
||||||
|
|
||||||
def build_container_routing_labels(prefix: str, strip_prefix=True):
|
def build_container_routing_labels(prefix: str, strip_prefix=True):
|
||||||
|
host_name = os.environ.get("API_HOST_NAME") or "localhost"
|
||||||
|
|
||||||
router_key = "traefik.http.routers.{prefix}.rule".format(prefix=prefix)
|
router_key = "traefik.http.routers.{prefix}.rule".format(prefix=prefix)
|
||||||
middleware_key = (
|
middleware_key = (
|
||||||
"traefik.http.middlewares.{prefix}-stripprefix.stripprefix.prefixes".format(
|
"traefik.http.middlewares.{prefix}-stripprefix.stripprefix.prefixes".format(
|
||||||
@@ -19,7 +21,8 @@ def build_container_routing_labels(prefix: str, strip_prefix=True):
|
|||||||
)
|
)
|
||||||
|
|
||||||
labels = {}
|
labels = {}
|
||||||
labels[router_key] = "Host(`localhost`) && PathPrefix(`/{prefix}`)".format(
|
labels[router_key] = "Host(`{host_name}`) && PathPrefix(`/{prefix}`)".format(
|
||||||
|
host_name=host_name,
|
||||||
prefix=prefix
|
prefix=prefix
|
||||||
)
|
)
|
||||||
if strip_prefix:
|
if strip_prefix:
|
||||||
@@ -54,6 +57,8 @@ def start_foundry_container(table: GameTable, key: KeyTable):
|
|||||||
client = docker.from_env()
|
client = docker.from_env()
|
||||||
container = None
|
container = None
|
||||||
networkName = client.containers.get(socket.gethostname()).attrs["HostConfig"]["NetworkMode"]
|
networkName = client.containers.get(socket.gethostname()).attrs["HostConfig"]["NetworkMode"]
|
||||||
|
data_bind = os.environ.get("FOUNDRY_DATA_BIND")
|
||||||
|
data_volume = os.environ.get("FOUNDRY_DATA_VOL")
|
||||||
|
|
||||||
if table.docker_id != None and table.docker_id != 0:
|
if table.docker_id != None and table.docker_id != 0:
|
||||||
try:
|
try:
|
||||||
@@ -65,33 +70,63 @@ def start_foundry_container(table: GameTable, key: KeyTable):
|
|||||||
container.start()
|
container.start()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
image = "felddy/foundryvtt:{version}".format(version=table.version)
|
|
||||||
labels = build_container_routing_labels(table.game_table_link, False)
|
|
||||||
volumes = {
|
|
||||||
"{data_bind}/{prefix}".format(
|
|
||||||
data_bind=os.environ.get("FOUNDRY_DATA_BIND"),
|
|
||||||
prefix=table.game_table_link,
|
|
||||||
): {"bind": "/data", "mode": "rw"},
|
|
||||||
"{data_bind}/container_cache".format(
|
|
||||||
data_bind=os.environ.get("FOUNDRY_DATA_BIND")
|
|
||||||
): {"bind": "/data/container_cache", "mode": "rw"},
|
|
||||||
}
|
|
||||||
environment = [
|
environment = [
|
||||||
"FOUNDRY_ROUTE_PREFIX={prefix}".format(prefix=table.game_table_link),
|
"FOUNDRY_ROUTE_PREFIX={prefix}".format(prefix=table.game_table_link),
|
||||||
"FOUNDRY_TELEMETRY=FALSE",
|
"FOUNDRY_TELEMETRY=FALSE",
|
||||||
"FOUNDRY_LICENSE_KEY={key_value}".format(key_value=key.key),
|
"FOUNDRY_LICENSE_KEY={key_value}".format(key_value=key.key),
|
||||||
]
|
]
|
||||||
|
|
||||||
ports = {"30000": str(30000 + table.game_table_id)}
|
ports = {"30000": str(30000 + table.game_table_id)}
|
||||||
|
|
||||||
container = client.containers.run(
|
image = "felddy/foundryvtt:{version}".format(version=table.version)
|
||||||
image=image,
|
labels = build_container_routing_labels(table.game_table_link, False)
|
||||||
labels=labels,
|
|
||||||
volumes=volumes,
|
if data_volume:
|
||||||
environment=environment,
|
|
||||||
ports=ports,
|
os.makedirs("/data/{prefix}".format(prefix=table.game_table_link), exist_ok=True)
|
||||||
detach=True,
|
|
||||||
network=networkName
|
mounts = [
|
||||||
)
|
docker.types.Mount(
|
||||||
|
target="/data",
|
||||||
|
source=data_volume,
|
||||||
|
type="volume",
|
||||||
|
subpath=table.game_table_link),
|
||||||
|
docker.types.Mount(
|
||||||
|
target="/data/container_cache",
|
||||||
|
source=data_volume,
|
||||||
|
type="volume",
|
||||||
|
subpath="container_cache")
|
||||||
|
]
|
||||||
|
|
||||||
|
container = client.containers.run(
|
||||||
|
image=image,
|
||||||
|
labels=labels,
|
||||||
|
mounts=mounts,
|
||||||
|
environment=environment,
|
||||||
|
ports=ports,
|
||||||
|
detach=True,
|
||||||
|
network=networkName
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
volumes = {
|
||||||
|
"{data_bind}/{prefix}".format(
|
||||||
|
data_bind=os.environ.get("FOUNDRY_DATA_BIND"),
|
||||||
|
prefix=table.game_table_link,
|
||||||
|
): {"bind": "/data", "mode": "rw"},
|
||||||
|
"{data_bind}/container_cache".format(
|
||||||
|
data_bind=os.environ.get("FOUNDRY_DATA_BIND")
|
||||||
|
): {"bind": "/data/container_cache", "mode": "rw"},
|
||||||
|
}
|
||||||
|
|
||||||
|
container = client.containers.run(
|
||||||
|
image=image,
|
||||||
|
labels=labels,
|
||||||
|
volumes=volumes,
|
||||||
|
environment=environment,
|
||||||
|
ports=ports,
|
||||||
|
detach=True,
|
||||||
|
network=networkName
|
||||||
|
)
|
||||||
|
|
||||||
return container.id
|
return container.id
|
||||||
|
|||||||
Reference in New Issue
Block a user