|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import colorama
|
|
|
|
from pathlib import Path
|
|
|
|
from termcolor import colored
|
|
|
|
|
|
|
|
from .sub_images import sub_images
|
|
|
|
|
|
|
|
DOCKER_IMAGE_PREFIX = os.environ.get("DOCKER_IMAGE_PREFIX", "quratorspk/ocrd-galley")
|
|
|
|
DOCKER_IMAGE_TAG = os.environ.get("DOCKER_IMAGE_TAG", "latest")
|
|
|
|
LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO")
|
|
|
|
|
|
|
|
# xdg-user-dirs is only available under Python 3.10+ etc. pp. → it is simpler
|
|
|
|
# to just roll it on our own.
|
|
|
|
XDG_CONFIG_HOME = os.environ.get("XDG_CONFIG_HOME", Path.home() / ".config")
|
|
|
|
XDG_DATA_HOME = os.environ.get("XDG_DATA_HOME", Path.home() / ".local" / "share")
|
|
|
|
XDG_CACHE_HOME = os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")
|
|
|
|
|
|
|
|
# ocrd_tesserocr
|
|
|
|
TESSDATA_PREFIX = XDG_DATA_HOME / "ocrd-resources" / "ocrd-tesserocr-recognize"
|
|
|
|
|
|
|
|
def main():
|
|
|
|
colorama.init()
|
|
|
|
|
|
|
|
argv = sys.argv.copy()
|
|
|
|
argv[0] = os.path.basename(argv[0])
|
|
|
|
|
|
|
|
# If we're running ocrd resmgr download we need to run the correct subimage.
|
|
|
|
if argv[:3] == ["ocrd", "resmgr", "download"] or \
|
|
|
|
argv[:3] == ["ocrd", "resmgr", "list-available"]:
|
|
|
|
# Default to the base image
|
|
|
|
sub_image = sub_images[argv[0]]
|
|
|
|
# But look for a match of the executable
|
|
|
|
for x in argv[3:]:
|
|
|
|
if x in sub_images:
|
|
|
|
sub_image = sub_images[x]
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
sub_image = sub_images[argv[0]]
|
|
|
|
|
|
|
|
docker_image = "%s-%s:%s" % (DOCKER_IMAGE_PREFIX, sub_image, DOCKER_IMAGE_TAG)
|
|
|
|
|
|
|
|
if DOCKER_IMAGE_TAG != "latest":
|
|
|
|
print(colored(f"Using {docker_image}", 'red'))
|
|
|
|
docker_run(argv, docker_image)
|
|
|
|
|
|
|
|
|
|
|
|
def docker_run(argv, docker_image):
|
|
|
|
docker_run_options = []
|
|
|
|
docker_run_options.extend(["--rm", "-t"])
|
|
|
|
docker_run_options.extend(["--mount", "type=bind,src=%s,target=/data" % os.getcwd()])
|
|
|
|
docker_run_options.extend(["--user", "%s:%s" % (os.getuid(), os.getgid())])
|
|
|
|
docker_run_options.extend(["-e", "LOG_LEVEL=%s" % LOG_LEVEL])
|
|
|
|
docker_run_options.extend(["-e", "_OCRD_COMPLETE"])
|
|
|
|
|
|
|
|
# home directory
|
|
|
|
docker_run_options.extend(["-e", "HOME=%s" % Path.home()])
|
|
|
|
|
|
|
|
# .config
|
|
|
|
docker_run_options.extend(["-e", "XDG_CONFIG_HOME=%s" % XDG_CONFIG_HOME])
|
|
|
|
docker_run_options.extend(["--mount", "type=bind,src=%s,target=%s" %
|
|
|
|
(XDG_CONFIG_HOME, XDG_CONFIG_HOME)])
|
|
|
|
# .local/share
|
|
|
|
docker_run_options.extend(["-e", "XDG_DATA_HOME=%s" % XDG_DATA_HOME])
|
|
|
|
docker_run_options.extend(["--mount", "type=bind,src=%s,target=%s" %
|
|
|
|
(XDG_DATA_HOME, XDG_DATA_HOME)])
|
|
|
|
# .cache
|
|
|
|
docker_run_options.extend(["-e", "XDG_CACHE_HOME=%s" % XDG_CACHE_HOME])
|
|
|
|
docker_run_options.extend(["--mount", "type=bind,src=%s,target=%s" %
|
|
|
|
(XDG_CACHE_HOME, XDG_CACHE_HOME)])
|
|
|
|
# .huggingface
|
|
|
|
os.makedirs(Path.home() / ".huggingface", exist_ok=True)
|
|
|
|
docker_run_options.extend(["--mount", "type=bind,src=%s,target=%s" %
|
|
|
|
(Path.home() / ".huggingface", Path("/root") / ".huggingface")])
|
|
|
|
|
|
|
|
# ocrd_tesserocr
|
|
|
|
docker_run_options.extend(["-e", "TESSDATA_PREFIX=%s" % TESSDATA_PREFIX])
|
|
|
|
|
|
|
|
# JAVA_TOOL_OPTIONS is used for Java proxy settings
|
|
|
|
if os.environ.get("JAVA_TOOL_OPTIONS"):
|
|
|
|
docker_run_options.extend(["-e", "JAVA_TOOL_OPTIONS"])
|
|
|
|
|
|
|
|
# The containers currently need to run privileged to allow it to read from e.g.
|
|
|
|
# /home on SELinux secured systems such as Fedora. We might want to use udica
|
|
|
|
# instead in the future.
|
|
|
|
docker_run_options.extend(["--privileged=true"])
|
|
|
|
|
|
|
|
docker_run_options.extend([docker_image])
|
|
|
|
docker_run_options.extend(argv)
|
|
|
|
|
|
|
|
docker_run_command = ["docker", "run"] + docker_run_options
|
|
|
|
c = subprocess.run(docker_run_command)
|
|
|
|
sys.exit(c.returncode)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|