devcontainers-contrib / features

🐳 Extra add-in features for Devcontainers and GitHub Codespaces
MIT License
214 stars 111 forks source link

[Bug]: latest version of mkdocs feature fails with babel error #525

Closed agyss closed 9 months ago

agyss commented 9 months ago

Feature id and version

latest version of mkdocs fails with babel error

Devcontainer base Image

mcr.microsoft.com/vscode/devcontainers/base:ubuntu-22.04

What happened?

Steps to reproduce:

  1. Create new devcontainer with following config:
    {
    "name": "latest version of mkdocs fails with babel error",
    "image": "mcr.microsoft.com/vscode/devcontainers/base:ubuntu-22.04",
    "features": {
        "ghcr.io/devcontainers-contrib/features/mkdocs:2": {
            "version": "latest"
        }
    }
    }
  2. Run mkdocs new test
  3. change to test dir cd test
  4. Run mkdocs serve to serve newly created documentation to localhost

Expected behavior:

Newly created documentation is served to localhost and accessible via the browser.

Actual behavior:

Error log:

Traceback (most recent call last):
  File "/usr/local/py-utils/bin/mkdocs", line 8, in <module>
    sys.exit(cli())
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/__main__.py", line 270, in serve_command
    serve.serve(**kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 59, in serve
    config = get_config()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 47, in get_config
    config = load_config(
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/base.py", line 366, in load_config
    from mkdocs.config.defaults import MkDocsConfig
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/defaults.py", line 7, in <module>
    from mkdocs.config import config_options as c
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/config_options.py", line 35, in <module>
    from mkdocs import plugins, theme, utils
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/theme.py", line 9, in <module>
    from mkdocs import localization, utils
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/localization.py", line 14, in <module>
    from babel.support import NullTranslations, Translations
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/support.py", line 23, in <module>
    from babel.dates import format_date, format_datetime, format_time, format_timedelta
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/dates.py", line 34, in <module>
    from babel import localtime
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/__init__.py", line 41, in <module>
    LOCALTZ = get_localzone()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/__init__.py", line 37, in get_localzone
    return _get_localzone()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/_unix.py", line 49, in _get_localzone
    tzinfo = _get_tzinfo(zone_name)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/_helpers.py", line 21, in _get_tzinfo
    return zoneinfo.ZoneInfo(tzenv)
  File "/usr/lib/python3.10/zoneinfo/_tzpath.py", line 67, in find_tzfile
    _validate_tzfile_path(key)
  File "/usr/lib/python3.10/zoneinfo/_tzpath.py", line 81, in _validate_tzfile_path
    raise ValueError(
ValueError: ZoneInfo keys may not be absolute paths, got: /UTC

Relevant log output

Traceback (most recent call last):
  File "/usr/local/py-utils/bin/mkdocs", line 8, in <module>
    sys.exit(cli())
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/__main__.py", line 270, in serve_command
    serve.serve(**kwargs)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 59, in serve
    config = get_config()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/commands/serve.py", line 47, in get_config
    config = load_config(
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/base.py", line 366, in load_config
    from mkdocs.config.defaults import MkDocsConfig
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/defaults.py", line 7, in <module>
    from mkdocs.config import config_options as c
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/config/config_options.py", line 35, in <module>
    from mkdocs import plugins, theme, utils
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/theme.py", line 9, in <module>
    from mkdocs import localization, utils
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/mkdocs/localization.py", line 14, in <module>
    from babel.support import NullTranslations, Translations
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/support.py", line 23, in <module>
    from babel.dates import format_date, format_datetime, format_time, format_timedelta
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/dates.py", line 34, in <module>
    from babel import localtime
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/__init__.py", line 41, in <module>
    LOCALTZ = get_localzone()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/__init__.py", line 37, in get_localzone
    return _get_localzone()
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/_unix.py", line 49, in _get_localzone
    tzinfo = _get_tzinfo(zone_name)
  File "/usr/local/py-utils/venvs/mkdocs/lib/python3.10/site-packages/babel/localtime/_helpers.py", line 21, in _get_tzinfo
    return zoneinfo.ZoneInfo(tzenv)
  File "/usr/lib/python3.10/zoneinfo/_tzpath.py", line 67, in find_tzfile
    _validate_tzfile_path(key)
  File "/usr/lib/python3.10/zoneinfo/_tzpath.py", line 81, in _validate_tzfile_path
    raise ValueError(
ValueError: ZoneInfo keys may not be absolute paths, got: /UTC
danielbraun89 commented 9 months ago

@agyss Thanks for reporting this!

This bug reproduces consistently on the mcr ubuntu family of images due to weird time zone /etc/localtime file. (In other images its working fine.)

command: docker run -it mcr.microsoft.com/devcontainers/base:debian ls /etc/localtime -l results: lrwxrwxrwx 1 root root 27 Sep 4 00:00 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC

However when running on mcr ubuntu: command: docker run -it mcr.microsoft.com/devcontainers/base:ubuntu-22.04 ls /etc/localtime -l results: lrwxrwxrwx 1 root root 24 Sep 1 23:59 /etc/localtime -> /usr/share/zoneinfo//UTC

Notice the extra / in before the UTC part. this causes os.readlink method of python (used in babel here ) to incorrectly resolve the link to the localtime path.

This can either be a bug in the mcr.microsoft.com/devcontainers/base:ubuntu image family creation, or a bug in babel that incorrectly relies on os.readlink.

As a quick fix I can add an explicit TZ=UTC environment variable to the mkdocs feature, but It looks like the same problem could appear in all python programs running on these mcr ubuntu containers

danielbraun89 commented 9 months ago

@agyss try ghcr.io/devcontainers-contrib/features/mkdocs:2.0.18 for the workaround fix