From 3c5bfb18831ec68887284bc4e0ef1768439b61aa Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Sun, 11 Jun 2023 01:03:47 +0200 Subject: [PATCH 1/6] attach to docker-ros as default user if DOCKER_UID is not set fixes #12 --- docker-run-docker-ros/src/docker_run/plugins/docker_ros.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py b/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py index ff5085a..8b365c4 100644 --- a/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py +++ b/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py @@ -33,7 +33,9 @@ def getRunFlags(cls, args: Dict[str, Any], unknown_args: List[str]) -> List[str] @classmethod def getExecFlags(cls, args: Dict[str, Any], unknown_args: List[str]) -> List[str]: flags = [] - if not args["no_user"] and runCommand(f"docker exec {args['name']} sh -c 'echo $DOCKER_ROS'")[0][:-1] == "1": + is_docker_ros = (runCommand(f"docker exec {args['name']} printenv DOCKER_ROS")[0][:-1] == "1") + is_non_root = (len(runCommand(f"docker exec {args['name']} printenv DOCKER_UID")[0][:-1]) > 0) + if not args["no_user"] and is_docker_ros and is_non_root: flags += cls.userExecFlags() return flags From a08926c49ec80564b0c3f7babda7a13db3751015 Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Sun, 11 Jun 2023 01:19:26 +0200 Subject: [PATCH 2/6] check default container name for prohibited characters fixes #4 --- docker-run-cli/src/docker_run/core.py | 4 ++-- docker-run-cli/src/docker_run/utils.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/docker-run-cli/src/docker_run/core.py b/docker-run-cli/src/docker_run/core.py index d54637e..7adc732 100644 --- a/docker-run-cli/src/docker_run/core.py +++ b/docker-run-cli/src/docker_run/core.py @@ -7,7 +7,7 @@ from typing import Any, Dict, List, Tuple import docker_run -from docker_run.utils import log, runCommand +from docker_run.utils import log, runCommand, validDockerContainerName from docker_run.plugins.plugin import Plugin # automatically load all available plugins inheriting from `Plugin` @@ -45,7 +45,7 @@ def format_help(self): parser.add_argument("--help", action="help", default=argparse.SUPPRESS, help="show this help message and exit") parser.add_argument("--image", help="image name (may also be specified without --image as last argument before command)") - parser.add_argument("--name", default=os.path.basename(os.getcwd()), help="container name; generates `docker exec` command if already running") + parser.add_argument("--name", default=validDockerContainerName(os.path.basename(os.getcwd())), help="container name; generates `docker exec` command if already running") parser.add_argument("--no-name", action="store_true", help="disable automatic container name (current directory)") parser.add_argument("--verbose", action="store_true", help="print generated command") parser.add_argument("--version", action="store_true", help="show program's version number and exit") diff --git a/docker-run-cli/src/docker_run/utils.py b/docker-run-cli/src/docker_run/utils.py index 8120027..c75122d 100644 --- a/docker-run-cli/src/docker_run/utils.py +++ b/docker-run-cli/src/docker_run/utils.py @@ -1,3 +1,4 @@ +import re import subprocess import sys from typing import Tuple @@ -28,3 +29,21 @@ def runCommand(cmd: str, *args, **kwargs) -> Tuple[str, str]: raise RuntimeError(f"System command '{cmd}' failed: {exc.stderr.decode()}") return output.stdout.decode(), output.stderr.decode() + + +def validDockerContainerName(name: str) -> str: + """Cleans a string such that it is a valid Docker container name. + + [a-zA-Z0-9][a-zA-Z0-9_.-] + + Args: + name (str): raw name + + Returns: + str: valid container name + """ + + name = re.sub('[^a-zA-Z0-9_.-]', '-', name) + name = re.sub('^[^a-zA-Z0-9]+', '', name) + + return name From 310f2f006af7bbbf03fe7039293ac1baee7df139 Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Sun, 11 Jun 2023 01:20:48 +0200 Subject: [PATCH 3/6] bump versions --- docker-run-cli/pyproject.toml | 2 +- docker-run-cli/src/docker_run/__init__.py | 2 +- docker-run-docker-ros/pyproject.toml | 2 +- docker-run-docker-ros/src/docker_run/plugins/docker_ros.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-run-cli/pyproject.toml b/docker-run-cli/pyproject.toml index c2fbc2c..f086878 100644 --- a/docker-run-cli/pyproject.toml +++ b/docker-run-cli/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "docker-run-cli" -version = "0.9.2" +version = "0.9.3" description = "'docker run' and 'docker exec' with useful defaults" license = {file = "LICENSE"} readme = "README.md" diff --git a/docker-run-cli/src/docker_run/__init__.py b/docker-run-cli/src/docker_run/__init__.py index 5143f87..09ffdf7 100644 --- a/docker-run-cli/src/docker_run/__init__.py +++ b/docker-run-cli/src/docker_run/__init__.py @@ -1,2 +1,2 @@ __name__ = "docker-run" -__version__ = "0.9.2" \ No newline at end of file +__version__ = "0.9.3" \ No newline at end of file diff --git a/docker-run-docker-ros/pyproject.toml b/docker-run-docker-ros/pyproject.toml index 1b99393..8678337 100644 --- a/docker-run-docker-ros/pyproject.toml +++ b/docker-run-docker-ros/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "docker-run-docker-ros" -version = "1.0.1" +version = "1.0.2" description = "docker-run plugin for Docker images built by docker-ros" license = {file = "LICENSE"} readme = "README.md" diff --git a/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py b/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py index 8b365c4..63f920d 100644 --- a/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py +++ b/docker-run-docker-ros/src/docker_run/plugins/docker_ros.py @@ -6,7 +6,7 @@ from docker_run.plugins.plugin import Plugin -__version__ = "1.0.1" +__version__ = "1.0.2" class DockerRosPlugin(Plugin): From 9100675611c318613bb74a0e399839e811bfce0f Mon Sep 17 00:00:00 2001 From: Lennart Reiher Date: Sun, 11 Jun 2023 02:07:28 +0200 Subject: [PATCH 4/6] explicitly launch xserver on mac closes #1 --- docker-run-cli/src/docker_run/plugins/core.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docker-run-cli/src/docker_run/plugins/core.py b/docker-run-cli/src/docker_run/plugins/core.py index c4d8982..38957b2 100644 --- a/docker-run-cli/src/docker_run/plugins/core.py +++ b/docker-run-cli/src/docker_run/plugins/core.py @@ -92,6 +92,9 @@ def x11GuiForwardingFlags(cls, docker_network: str = "bridge") -> List[str]: display = os.environ.get("DISPLAY") if display is None: return [] + + if cls.OS == "Darwin": + runCommand(f"xhost +local:") xsock = "/tmp/.X11-unix" xauth = tempfile.NamedTemporaryFile(prefix='.docker.xauth.', delete=False).name @@ -101,9 +104,9 @@ def x11GuiForwardingFlags(cls, docker_network: str = "bridge") -> List[str]: os.chmod(xauth, 0o777) if docker_network != "host" and not display.startswith(":"): - display="172.17.0.1:" + display.split(":")[1] + display = "172.17.0.1:" + display.split(":")[1] if cls.OS == "Darwin": - display="host.docker.internal:" + display.split(":")[1] + display = "host.docker.internal:" + display.split(":")[1] flags = [] flags.append(f"--env DISPLAY={display}") From f95ed1931453790c3825270f50d20ce1b04315ed Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Mon, 12 Jun 2023 17:06:25 +0200 Subject: [PATCH 5/6] do not attach if `--image` is given --- docker-run-cli/src/docker_run/core.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docker-run-cli/src/docker_run/core.py b/docker-run-cli/src/docker_run/core.py index 7adc732..5dd2071 100644 --- a/docker-run-cli/src/docker_run/core.py +++ b/docker-run-cli/src/docker_run/core.py @@ -88,14 +88,19 @@ def buildDockerCommand(args: Dict[str, Any], unknown_args: List[str] = [], cmd_a # check for running container if args["no_name"]: args["name"] = None - new_container = False - running_containers = runCommand('docker ps --format "{{.Names}}"')[0].split('\n') - new_container = not (args["name"] in running_containers) + new_container = True + else: + new_container = False + running_containers = runCommand('docker ps --format "{{.Names}}"')[0].split('\n') + new_container = not (args["name"] in running_containers) + if not new_container and args["image"] is not None and len(args["image"]) > 0: + args["name"] = None if args["name"] == validDockerContainerName(os.path.basename(os.getcwd())) else args["name"] + new_container = True if new_container: # docker run log_msg = f"Starting new container " - if not args["no_name"]: + if args["name"] is not None: log_msg += f"'{args['name']}'" log(log_msg + " ...") docker_cmd = ["docker", "run"] From 9300a79adffd7717631a06e964d297cbc2fb8bf4 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Busch Date: Mon, 12 Jun 2023 18:10:01 +0200 Subject: [PATCH 6/6] save default container name in variable --- docker-run-cli/src/docker_run/core.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-run-cli/src/docker_run/core.py b/docker-run-cli/src/docker_run/core.py index 5dd2071..6b51630 100644 --- a/docker-run-cli/src/docker_run/core.py +++ b/docker-run-cli/src/docker_run/core.py @@ -21,6 +21,7 @@ if isinstance(cls, type) and issubclass(cls, Plugin) and cls is not Plugin: PLUGINS.append(cls) +DEFAULT_CONTAINER_NAME = validDockerContainerName(os.path.basename(os.getcwd())) def parseArguments() -> Tuple[argparse.Namespace, List[str], List[str]]: @@ -45,7 +46,7 @@ def format_help(self): parser.add_argument("--help", action="help", default=argparse.SUPPRESS, help="show this help message and exit") parser.add_argument("--image", help="image name (may also be specified without --image as last argument before command)") - parser.add_argument("--name", default=validDockerContainerName(os.path.basename(os.getcwd())), help="container name; generates `docker exec` command if already running") + parser.add_argument("--name", default=DEFAULT_CONTAINER_NAME, help="container name; generates `docker exec` command if already running") parser.add_argument("--no-name", action="store_true", help="disable automatic container name (current directory)") parser.add_argument("--verbose", action="store_true", help="print generated command") parser.add_argument("--version", action="store_true", help="show program's version number and exit") @@ -94,7 +95,7 @@ def buildDockerCommand(args: Dict[str, Any], unknown_args: List[str] = [], cmd_a running_containers = runCommand('docker ps --format "{{.Names}}"')[0].split('\n') new_container = not (args["name"] in running_containers) if not new_container and args["image"] is not None and len(args["image"]) > 0: - args["name"] = None if args["name"] == validDockerContainerName(os.path.basename(os.getcwd())) else args["name"] + args["name"] = None if args["name"] == DEFAULT_CONTAINER_NAME else args["name"] new_container = True if new_container: # docker run