Skip to content

Commit

Permalink
Merge branch 'main' into tfoote/strip_name_usage
Browse files Browse the repository at this point in the history
  • Loading branch information
tfoote authored Sep 23, 2024
2 parents 950e309 + 3f02bdc commit 20dc305
Show file tree
Hide file tree
Showing 14 changed files with 175 additions and 57 deletions.
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

<!-- insertion marker -->
## [v0.2.17](https://github.com/osrf/rocker/releases/tag/v0.2.17) - 2024-08-28

<small>[Compare with v0.2.16](https://github.com/osrf/rocker/compare/v0.2.16...v0.2.17)</small>

### Added
- [nvidia_extension] add 24.04 to supported_versions (#279)

## [v0.2.16](https://github.com/osrf/rocker/releases/tag/v0.2.16) - 2024-04-01

<small>[Compare with v0.2.15](https://github.com/osrf/rocker/compare/v0.2.15...v0.2.16)</small>

### Fixed

- Fix --user arg when using empy 4 (#276) ([4078d22](https://github.com/osrf/rocker/commit/4078d223a2158e9a6fea31d8871dc7df7ee094f0) by Gary Servin).

## [v0.2.15](https://github.com/osrf/rocker/releases/tag/v0.2.15) - 2024-03-01

<small>[Compare with v0.2.14](https://github.com/osrf/rocker/compare/v0.2.14...v0.2.15)</small>
Expand Down Expand Up @@ -286,4 +301,3 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

- remove legacy test function ([4c1466a](https://github.com/osrf/rocker/commit/4c1466a217e4e150aa722836b3768abcd2efe425) by Tully Foote).
- remove legacy comments ([38b5903](https://github.com/osrf/rocker/commit/38b59034eb373ff12619529383dc8812446890ad) by Tully Foote).

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Whereas with `rocker` you can invoke your specific plugins and it will use multi



## Know extensions
## Known extensions

Rocker supports extensions via entry points there are some built in but you can add your own.

Expand All @@ -38,7 +38,7 @@ You can get full details on the extensions from the main `rocker --help` command
- pulse -- Mount pulse audio into the container
- ssh -- Pass through ssh access to the container.

As well as access to many of the docker arguments as well such as `device`, `env`, `volume`, `name`, `network`, and `privileged`.
As well as access to many of the docker arguments as well such as `device`, `env`, `volume`, `name`, `network`, `ipc`, and `privileged`.

### Externally maintained extensions

Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

kwargs = {
'name': 'rocker',
'version': '0.2.15',
'version': '0.2.17',
'packages': ['rocker'],
'package_dir': {'': 'src'},
'package_data': {'rocker': ['templates/*.em']},
Expand All @@ -54,6 +54,7 @@
'group_add = rocker.extensions:GroupAdd',
'home = rocker.extensions:HomeDir',
'hostname = rocker.extensions:Hostname',
'ipc = rocker.extensions:Ipc',
'name = rocker.extensions:Name',
'network = rocker.extensions:Network',
'nvidia = rocker.nvidia_extension:Nvidia',
Expand Down
2 changes: 1 addition & 1 deletion src/rocker/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def check_args_for_activation(cls, cli_args):
return True if cli_args.get(cls.get_name()) else False

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
raise NotImplementedError


Expand Down
100 changes: 65 additions & 35 deletions src/rocker/extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def get_docker_args(self, cliargs):
return args

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--devices',
default=defaults.get('devices', None),
nargs='*',
Expand Down Expand Up @@ -79,13 +79,43 @@ def get_snippet(self, cliargs):
return empy_expand(snippet, self.get_environment_subs())

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(DevHelpers.get_name()),
action='store_true',
default=defaults.get('dev_helpers', None),
help="add development tools emacs and byobu to your environment")


class Expose(RockerExtension):
@staticmethod
def get_name():
return 'expose'

def get_preamble(self, cliargs):
return ''

def get_docker_args(self, cliargs):
args = ['']
ports = cliargs.get('expose', [])
for port in ports:
args.append(' --expose {0}'.format(port))
return ' '.join(args)

@staticmethod
def register_arguments(parser, defaults={}):
parser.add_argument('--expose',
default=defaults.get('expose', None),
action='append',
help="Exposes a port from the container to host machine.")

@staticmethod
def register_arguments(parser, defaults={}):
parser.add_argument('--expose',
default=defaults.get('expose', None),
action='append',
help="Exposes a port from the container to host machine.")


class Hostname(RockerExtension):
@staticmethod
def get_name():
Expand All @@ -102,10 +132,33 @@ def get_docker_args(self, cliargs):
return args

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--hostname', default=defaults.get('hostname', ''),
help='Hostname of the container.')


class Ipc(RockerExtension):
@staticmethod
def get_name():
return 'ipc'
def __init__(self):
self.name = Ipc.get_name()

def get_preamble(self, cliargs):
return ''

def get_docker_args(self, cliargs):
args = ''
ipc = cliargs.get('ipc', None)
args += ' --ipc %s ' % ipc
return args

@staticmethod
def register_arguments(parser, defaults={}):
parser.add_argument('--ipc', default=defaults.get('ipc', None),
help='IPC namespace to use. To share ipc with the host use host. More details can be found at https://docs.docker.com/reference/cli/docker/container/run/#ipc')


class Name(RockerExtension):
@staticmethod
def get_name():
Expand All @@ -122,7 +175,7 @@ def get_docker_args(self, cliargs):
return args

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--name', default=defaults.get('name', ''),
help='Name of the container.')

Expand All @@ -142,36 +195,13 @@ def get_docker_args(self, cliargs):
return args

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
client = get_docker_client()
parser.add_argument('--network', choices=[n['Name'] for n in client.networks()],
default=defaults.get('network', None),
help="What network configuration to use.")


class Expose(RockerExtension):
@staticmethod
def get_name():
return 'expose'

def get_preamble(self, cliargs):
return ''

def get_docker_args(self, cliargs):
args = ['']
ports = cliargs.get('expose', [])
for port in ports:
args.append(' --expose {0}'.format(port))
return ' '.join(args)

@staticmethod
def register_arguments(parser, defaults={}):
parser.add_argument('--expose',
default=defaults.get('expose', None),
action='append',
help="Exposes a port from the container to host machine.")


class Port(RockerExtension):
@staticmethod
def get_name():
Expand All @@ -188,7 +218,7 @@ def get_docker_args(self, cliargs):
return ' '.join(args)

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--port',
default=defaults.get('port', None),
action='append',
Expand Down Expand Up @@ -224,7 +254,7 @@ def get_docker_args(self, cliargs):
return args % self.get_environment_subs()

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(PulseAudio.get_name()),
action='store_true',
default=defaults.get(PulseAudio.get_name(), None),
Expand All @@ -240,7 +270,7 @@ def get_docker_args(self, cliargs):
return ' -v %s:%s ' % (Path.home(), Path.home())

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(HomeDir.get_name()),
action='store_true',
default=defaults.get(HomeDir.get_name(), None),
Expand Down Expand Up @@ -295,7 +325,7 @@ def get_snippet(self, cliargs):
return empy_expand(snippet, substitutions)

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(User.get_name()),
action='store_true',
default=defaults.get('user', None),
Expand Down Expand Up @@ -348,7 +378,7 @@ def get_docker_args(self, cli_args):
return ' '.join(args)

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--env', '-e',
metavar='NAME[=VALUE]',
type=str,
Expand Down Expand Up @@ -381,7 +411,7 @@ def get_docker_args(self, cli_args):
return ' --privileged'

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(Privileged.get_name()),
action='store_true',
default=defaults.get(Privileged.get_name(), None),
Expand All @@ -405,7 +435,7 @@ def get_docker_args(self, cliargs):
return ' '.join(args)

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(GroupAdd.get_name()),
default=defaults.get(GroupAdd.get_name(), None),
action='append',
Expand Down
2 changes: 1 addition & 1 deletion src/rocker/git_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def get_docker_args(self, cli_args):
return args

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument('--git',
action='store_true',
default=defaults.get(Git.get_name(), None),
Expand Down
47 changes: 40 additions & 7 deletions src/rocker/nvidia_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,35 @@
from .core import RockerExtension
from .em import empy_expand

GLVND_VERSION_POLICY_LATEST_LTS='latest_lts'

NVIDIA_GLVND_VALID_VERSIONS=['16.04', '18.04','20.04', '22.04', '24.04']

def get_docker_version():
docker_version_raw = get_docker_client().version()['Version']
# Fix for version 17.09.0-ce
return Version(docker_version_raw.split('-')[0])

def glvnd_version_from_policy(image_version, policy):
# Default policy GLVND_VERSION_POLICY_LATEST_LTS
if not policy:
policy = GLVND_VERSION_POLICY_LATEST_LTS

if policy == GLVND_VERSION_POLICY_LATEST_LTS:
if image_version in ['16.04', '16.10', '17.04', '17.10']:
return '16.04'
if image_version in ['18.04', '18.10', '19.04', '19.10']:
return '18.04'
if image_version in ['20.04', '20.10', '21.04', '21.10']:
return '20.04'
if image_version in ['22.04', '22.10', '23.04', '23.10']:
return '22.04'
# 24.04 is not available yet
# if image_version in ['24.04', '24.10', '25.04', '25.10']:
# return '24.04'
return '22.04'
return None

class X11(RockerExtension):
@staticmethod
def get_name():
Expand Down Expand Up @@ -70,7 +93,7 @@ def precondition_environment(self, cliargs):
raise ex

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(X11.get_name()),
action='store_true',
default=defaults.get(X11.get_name(), None),
Expand All @@ -85,15 +108,15 @@ def get_name():
def __init__(self):
self._env_subs = None
self.supported_distros = ['Ubuntu', 'Debian GNU/Linux']
self.supported_versions = ['16.04', '18.04', '20.04', '10', '22.04']
self.supported_versions = ['16.04', '18.04', '20.04', '10', '22.04', '24.04']


def get_environment_subs(self, cliargs={}):
if not self._env_subs:
self._env_subs = {}
self._env_subs['user_id'] = os.getuid()
self._env_subs['username'] = getpass.getuser()

# non static elements test every time
detected_os = detect_os(cliargs['base_image'], print, nocache=cliargs.get('nocache', False))
if detected_os is None:
Expand All @@ -110,6 +133,10 @@ def get_environment_subs(self, cliargs={}):
print("WARNING distro %s version %s not in supported list by Nvidia supported versions" % (dist, ver), self.supported_versions)
sys.exit(1)
# TODO(tfoote) add a standard mechanism for checking preconditions and disabling plugins
nvidia_glvnd_version = cliargs.get('nvidia_glvnd_version', None)
if not nvidia_glvnd_version:
nvidia_glvnd_version = glvnd_version_from_policy(ver, cliargs.get('nvidia_glvnd_policy', None) )
self._env_subs['nvidia_glvnd_version'] = nvidia_glvnd_version

return self._env_subs

Expand All @@ -132,13 +159,21 @@ def get_docker_args(self, cliargs):
return " --runtime=nvidia"

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(Nvidia.get_name()),
choices=['auto', 'runtime', 'gpus'],
nargs='?',
const='auto',
default=defaults.get(Nvidia.get_name(), None),
help="Enable nvidia. Default behavior is to pick flag based on docker version.")
parser.add_argument('--nvidia-glvnd-version',
choices=NVIDIA_GLVND_VALID_VERSIONS,
default=defaults.get('nvidia-glvnd-version', None),
help="Explicitly select an nvidia glvnd version")
parser.add_argument('--nvidia-glvnd-policy',
choices=[GLVND_VERSION_POLICY_LATEST_LTS],
default=defaults.get('nvidia-glvnd-policy', GLVND_VERSION_POLICY_LATEST_LTS),
help="Set an nvidia glvnd version policy if version is unset")

class Cuda(RockerExtension):
@staticmethod
Expand Down Expand Up @@ -193,10 +228,8 @@ def get_docker_args(self, cliargs):
# Runtime requires --nvidia option too

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(Cuda.get_name()),
action='store_true',
default=defaults.get('cuda', None),
help="Install cuda and nvidia-cuda-dev into the container")


2 changes: 1 addition & 1 deletion src/rocker/rmw_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def get_snippet(self, cliargs):
return empy_expand(snippet, data)

@staticmethod
def register_arguments(parser, defaults={}):
def register_arguments(parser, defaults):
parser.add_argument(name_to_argument(RMW.get_name()),
default=defaults.get('rmw', None),
nargs=1,
Expand Down
Loading

0 comments on commit 20dc305

Please sign in to comment.