mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-09 19:12:59 +00:00
Refactor container.exec_run usages
This commit is contained in:
@@ -84,7 +84,7 @@ and `markdown_piece(container)` method returns a piece of the build manifest.
|
||||
:start-at: class AptPackagesManifest
|
||||
```
|
||||
|
||||
- `quoted_output(container, cmd)` simply runs the command inside a container using `DockerRunner.run_simple_command` and wraps it to triple quotes to create a valid markdown piece.
|
||||
- `quoted_output(container, cmd)` simply runs the command inside a container using `DockerRunner.exec_cmd` and wraps it to triple quotes to create a valid markdown piece.
|
||||
It also adds the command which was run to the markdown piece.
|
||||
- `manifests/` subdirectory contains all the manifests.
|
||||
- `apps/write_manifest.py` is a Python executable to create the build manifest and history line for an image.
|
||||
|
@@ -3,4 +3,4 @@
|
||||
from tagging.utils.docker_runner import DockerRunner
|
||||
|
||||
with DockerRunner("ubuntu") as container:
|
||||
DockerRunner.run_simple_command(container, cmd="env", print_result=True)
|
||||
DockerRunner.exec_cmd(container, cmd="env", print_output=True)
|
||||
|
@@ -13,7 +13,7 @@ class CondaEnvironmentManifest(ManifestInterface):
|
||||
return MarkdownPiece(
|
||||
title="## Python Packages",
|
||||
sections=[
|
||||
DockerRunner.run_simple_command(container, "python --version"),
|
||||
DockerRunner.exec_cmd(container, "python --version"),
|
||||
quoted_output(container, "conda info"),
|
||||
quoted_output(container, "mamba info"),
|
||||
quoted_output(container, "mamba list"),
|
||||
|
@@ -9,7 +9,7 @@ from tagging.utils.docker_runner import DockerRunner
|
||||
class UbuntuVersionTagger(TaggerInterface):
|
||||
@staticmethod
|
||||
def tag_value(container: Container) -> str:
|
||||
os_release = DockerRunner.run_simple_command(
|
||||
os_release = DockerRunner.exec_cmd(
|
||||
container,
|
||||
"cat /etc/os-release",
|
||||
).split("\n")
|
||||
|
@@ -7,16 +7,16 @@ from tagging.utils.docker_runner import DockerRunner
|
||||
|
||||
|
||||
def _get_program_version(container: Container, program: str) -> str:
|
||||
return DockerRunner.run_simple_command(container, cmd=f"{program} --version")
|
||||
return DockerRunner.exec_cmd(container, cmd=f"{program} --version")
|
||||
|
||||
|
||||
def _get_pip_package_version(container: Container, package: str) -> str:
|
||||
PIP_VERSION_PREFIX = "Version: "
|
||||
|
||||
package_info = DockerRunner.run_simple_command(
|
||||
package_info = DockerRunner.exec_cmd(
|
||||
container,
|
||||
cmd=f"pip show {package}",
|
||||
print_result=False,
|
||||
print_output=False,
|
||||
)
|
||||
version_line = package_info.split("\n")[1]
|
||||
assert version_line.startswith(PIP_VERSION_PREFIX)
|
||||
|
@@ -43,14 +43,12 @@ class DockerRunner:
|
||||
LOGGER.info(f"Container {self.container.name} removed")
|
||||
|
||||
@staticmethod
|
||||
def run_simple_command(
|
||||
container: Container, cmd: str, print_result: bool = True
|
||||
) -> str:
|
||||
def exec_cmd(container: Container, cmd: str, print_output: bool = True) -> str:
|
||||
LOGGER.info(f"Running cmd: '{cmd}' on container: {container}")
|
||||
out = container.exec_run(cmd)
|
||||
result = out.output.decode().rstrip()
|
||||
assert isinstance(result, str)
|
||||
if print_result:
|
||||
LOGGER.info(f"Command result: {result}")
|
||||
assert out.exit_code == 0, f"Command: {cmd} failed"
|
||||
return result
|
||||
exec_result = container.exec_run(cmd)
|
||||
output = exec_result.output.decode().rstrip()
|
||||
assert isinstance(output, str)
|
||||
if print_output:
|
||||
LOGGER.info(f"Command output: {output}")
|
||||
assert exec_result.exit_code == 0, f"Command: {cmd} failed"
|
||||
return output
|
||||
|
@@ -6,7 +6,7 @@ from tagging.utils.docker_runner import DockerRunner
|
||||
|
||||
|
||||
def quoted_output(container: Container, cmd: str) -> str:
|
||||
cmd_output = DockerRunner.run_simple_command(container, cmd, print_result=False)
|
||||
cmd_output = DockerRunner.exec_cmd(container, cmd, print_output=False)
|
||||
# For example, `mamba info` adds redundant empty lines
|
||||
cmd_output = cmd_output.strip("\n")
|
||||
# For example, R packages list contains trailing backspaces
|
||||
|
@@ -47,8 +47,8 @@ def test_nb_user_change(container: TrackedContainer) -> None:
|
||||
)
|
||||
command = f'stat -c "%F %U %G" /home/{nb_user}/.jupyter'
|
||||
expected_output = f"directory {nb_user} users"
|
||||
cmd = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = cmd.output.decode().strip("\n")
|
||||
exec_result = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = exec_result.output.decode().strip("\n")
|
||||
assert (
|
||||
output == expected_output
|
||||
), f"Hidden folder .jupyter was not copied properly to {nb_user} home folder. stat: {output}, expected {expected_output}"
|
||||
|
@@ -78,8 +78,8 @@ def test_tini_entrypoint(
|
||||
LOGGER.info(f"Test that {command} is launched as PID {pid} ...")
|
||||
running_container = container.run_detached(tty=True)
|
||||
# Select the PID 1 and get the corresponding command
|
||||
cmd = running_container.exec_run(f"ps -p {pid} -o comm=")
|
||||
output = cmd.output.decode().strip("\n")
|
||||
exec_result = running_container.exec_run(f"ps -p {pid} -o comm=")
|
||||
output = exec_result.output.decode().strip("\n")
|
||||
assert "ERROR" not in output
|
||||
assert "WARNING" not in output
|
||||
assert output == command, f"{command} shall be launched as pid {pid}, got {output}"
|
||||
|
@@ -60,15 +60,17 @@ def test_nb_user_change(container: TrackedContainer) -> None:
|
||||
LOGGER.info(f"Checking {nb_user} id ...")
|
||||
command = "id"
|
||||
expected_output = f"uid=1000({nb_user}) gid=100(users) groups=100(users)"
|
||||
cmd = running_container.exec_run(command, user=nb_user, workdir=f"/home/{nb_user}")
|
||||
output = cmd.output.decode().strip("\n")
|
||||
exec_result = running_container.exec_run(
|
||||
command, user=nb_user, workdir=f"/home/{nb_user}"
|
||||
)
|
||||
output = exec_result.output.decode().strip("\n")
|
||||
assert output == expected_output, f"Bad user {output}, expected {expected_output}"
|
||||
|
||||
LOGGER.info(f"Checking if {nb_user} owns his home folder ...")
|
||||
command = f'stat -c "%U %G" /home/{nb_user}/'
|
||||
expected_output = f"{nb_user} users"
|
||||
cmd = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = cmd.output.decode().strip("\n")
|
||||
exec_result = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = exec_result.output.decode().strip("\n")
|
||||
assert (
|
||||
output == expected_output
|
||||
), f"Bad owner for the {nb_user} home folder {output}, expected {expected_output}"
|
||||
@@ -78,8 +80,8 @@ def test_nb_user_change(container: TrackedContainer) -> None:
|
||||
)
|
||||
command = f'stat -c "%F %U %G" /home/{nb_user}/work'
|
||||
expected_output = f"directory {nb_user} users"
|
||||
cmd = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = cmd.output.decode().strip("\n")
|
||||
exec_result = running_container.exec_run(command, workdir=f"/home/{nb_user}")
|
||||
output = exec_result.output.decode().strip("\n")
|
||||
assert (
|
||||
output == expected_output
|
||||
), f"Folder work was not copied properly to {nb_user} home folder. stat: {output}, expected {expected_output}"
|
||||
|
@@ -44,12 +44,12 @@ def test_matplotlib(
|
||||
command=["bash", "-c", "sleep infinity"],
|
||||
)
|
||||
command = f"python {cont_data_dir}/{test_file}"
|
||||
cmd = running_container.exec_run(command)
|
||||
LOGGER.debug(cmd.output.decode())
|
||||
assert cmd.exit_code == 0, f"Command {command} failed"
|
||||
exec_result = running_container.exec_run(command)
|
||||
LOGGER.debug(exec_result.output.decode())
|
||||
assert exec_result.exit_code == 0, f"Command {command} failed"
|
||||
# Checking if the file is generated
|
||||
# https://stackoverflow.com/a/15895594/4413446
|
||||
command = f"test -s {output_dir}/{expected_file}"
|
||||
cmd = running_container.exec_run(command)
|
||||
LOGGER.debug(cmd.output.decode())
|
||||
assert cmd.exit_code == 0, f"Command {command} failed"
|
||||
exec_result = running_container.exec_run(command)
|
||||
LOGGER.debug(exec_result.output.decode())
|
||||
assert exec_result.exit_code == 0, f"Command {command} failed"
|
||||
|
@@ -90,8 +90,8 @@ class CondaPackageHelper:
|
||||
|
||||
def _execute_command(self, command: list[str]) -> str:
|
||||
"""Execute a command on a running container"""
|
||||
rc = self.running_container.exec_run(command, stderr=False)
|
||||
return rc.output.decode() # type: ignore
|
||||
exec_result = self.running_container.exec_run(command, stderr=False)
|
||||
return exec_result.output.decode() # type: ignore
|
||||
|
||||
@staticmethod
|
||||
def _parse_package_versions(env_export: str) -> dict[str, set[str]]:
|
||||
|
Reference in New Issue
Block a user