Add support for naming docker containers. Use agent.docker_container_name_format to configure the name format (disabled by default) (issue clearml/#412)

Add missing entries in docs/clearml.conf
This commit is contained in:
allegroai 2021-08-12 13:38:26 +03:00
parent 5c5802c089
commit 5e4c495d62
3 changed files with 53 additions and 0 deletions

View File

@ -197,4 +197,10 @@
enabled: true enabled: true
extra_keys: [] extra_keys: []
} }
# Name docker containers created by the daemon using the following string format (supported from Docker 0.6.5)
# Allowed variables are task_id, worker_id and rand_string (random lower-case letters string, up to 32 charaters)
# Note: resulting name must start with an alpha-numeric character and continue with a alpha-numeric characters,
# underscores (_), dots (.) and/or dashes (-)
#docker_container_name_format: "clearml-id-{task_id}-{rand_string:.8}"
} }

View File

@ -5,10 +5,12 @@ import json
import logging import logging
import os import os
import os.path import os.path
import random
import re import re
import shlex import shlex
import shutil import shutil
import signal import signal
import string
import subprocess import subprocess
import sys import sys
import traceback import traceback
@ -125,6 +127,9 @@ DOCKER_ROOT_CONF_FILE = "/root/clearml.conf"
DOCKER_DEFAULT_CONF_FILE = "/root/default_clearml.conf" DOCKER_DEFAULT_CONF_FILE = "/root/default_clearml.conf"
sys_random = random.SystemRandom()
@attr.s @attr.s
class LiteralScriptManager(object): class LiteralScriptManager(object):
""" """
@ -687,6 +692,23 @@ class Worker(ServiceCommandSection):
if self._services_mode: if self._services_mode:
# if this is services mode, give the docker a unique worker id, as it will register itself. # if this is services mode, give the docker a unique worker id, as it will register itself.
docker_params["worker_id"] = worker_id docker_params["worker_id"] = worker_id
name_format = self._session.config.get('agent.docker_container_name_format', None)
if name_format:
try:
name = name_format.format(
task_id=re.sub(r'[^a-zA-Z0-9._-]', '-', task_id),
worker_id=re.sub(r'[^a-zA-Z0-9._-]', '-', worker_id),
rand_string="".join(sys_random.choice(string.ascii_lowercase) for _ in range(32))
)
except Exception as ex:
print("Warning: failed generating docker container name: {}".format(ex))
else:
if self._valid_docker_container_name(name):
docker_params["name"] = name
else:
print("Warning: generated docker container name is invalid: {}".format(name))
full_docker_cmd = self.docker_image_func(**docker_params) full_docker_cmd = self.docker_image_func(**docker_params)
# if we are using the default docker, update back the Task: # if we are using the default docker, update back the Task:
@ -3119,6 +3141,7 @@ class Worker(ServiceCommandSection):
docker_bash_setup_script=None, docker_bash_setup_script=None,
auth_token=None, auth_token=None,
worker_tags=None, worker_tags=None,
name=None,
): ):
docker = 'docker' docker = 'docker'
@ -3294,6 +3317,7 @@ class Worker(ServiceCommandSection):
' ; ' ' ; '
base_cmd += ( base_cmd += (
(['--name', name] if name else []) +
['-v', conf_file+':'+DOCKER_ROOT_CONF_FILE] + ['-v', conf_file+':'+DOCKER_ROOT_CONF_FILE] +
(['-v', host_ssh_cache+':/root/.ssh'] if host_ssh_cache else []) + (['-v', host_ssh_cache+':/root/.ssh'] if host_ssh_cache else []) +
(['-v', host_apt_cache+':/var/cache/apt/archives'] if host_apt_cache else []) + (['-v', host_apt_cache+':/var/cache/apt/archives'] if host_apt_cache else []) +
@ -3500,6 +3524,11 @@ class Worker(ServiceCommandSection):
return result return result
@staticmethod
def _valid_docker_container_name(name):
# type: (str) -> bool
return re.fullmatch(r"^[a-zA-Z0-9][a-zA-Z0-9_.-]+$", name) is not None
if __name__ == "__main__": if __name__ == "__main__":
pass pass

View File

@ -163,6 +163,24 @@ agent {
# it Should be detected automatically. Override with os environment CUDA_VERSION / CUDNN_VERSION # it Should be detected automatically. Override with os environment CUDA_VERSION / CUDNN_VERSION
# cuda_version: 10.1 # cuda_version: 10.1
# cudnn_version: 7.6 # cudnn_version: 7.6
# Hide docker environment variables containing secrets when printing out the docker command by replacing their
# values with "********". Turning this feature on will hide the following environment variables values:
# CLEARML_API_SECRET_KEY, CLEARML_AGENT_GIT_PASS, AWS_SECRET_ACCESS_KEY, AZURE_STORAGE_KEY
# To include more environment variables, add their keys to the "extra_keys" list. E.g. to make sure the value of
# your custom environment variable named MY_SPECIAL_PASSWORD will not show in the logs when included in the
# docker command, set:
# extra_keys: ["MY_SPECIAL_PASSWORD"]
hide_docker_command_env_vars {
enabled: true
extra_keys: []
}
# Name docker containers created by the daemon using the following string format (supported from Docker 0.6.5)
# Allowed variables are task_id, worker_id and rand_string (random lower-case letters string, up to 32 charaters)
# Note: resulting name must start with an alpha-numeric character and continue with a alpha-numeric characters,
# underscores (_), dots (.) and/or dashes (-)
#docker_container_name_format: "clearml-id-{task_id}-{rand_string:.8}"
} }
sdk { sdk {