OxL Справочник OxL
РусскийEnglish

Образы Docker

Тулчейн доступен и в виде образов на ubuntu:24.04 (glibc 2.39; релизу нужна 2.38+). Два варианта:

тегсостав
ghcr.io/descaldnd/oxl:1.0.0-beta, :latest (full)тулчейн в /opt/oxl-<версия> (ссылки в /usr/local/bin), clang-18 как драйвер компоновки, lld-18, библиотеки рантайма и их -dev-пакеты, lldb-18 и lldb-dap-18, git, документация и oxl-docs
ghcr.io/descaldnd/oxl:1.0.0-beta-slim, :slim (slim)тулчейн без документации, clang-18, lld-18 и библиотеки рантайма; без отладчика, без -dev-пакетов, без git

В обоих пользователь oxl (uid 1000), рабочий каталог /work, кэш OXL_HOME=/home/oxl/.oxl, UTF-8 локаль и ca-certificates. Порты по умолчанию не публикуются.

Запуск#

sh
docker run --rm -v "$PWD:/work" ghcr.io/descaldnd/oxl oxl run .
docker run --rm -v "$PWD:/work" ghcr.io/descaldnd/oxl oxl test
docker run --rm -v "$PWD:/work" -v oxl-cache:/home/oxl/.oxl ghcr.io/descaldnd/oxl:slim oxl build -o app    # том с кэшем между запусками
docker run --rm ghcr.io/descaldnd/oxl oxl doctor                                                          # окружение внутри контейнера

Файлы создаются от uid 1000; на Linux-хосте с другим id добавьте --user "$(id -u):$(id -g)" (и -e OXL_HOME=/tmp/oxl).

Многоэтапная сборка приложения#

Собранная программа — обычный динамический ELF: ей нужны рантайм C++ и системные библиотеки, до которых программа дотягивается (--as-needed; их показывает ldd app). Соберите в slim-образе и скопируйте бинарник в чистый ubuntu:24.04:

oxl
FROM ghcr.io/descaldnd/oxl:slim AS build
WORKDIR /work
COPY --chown=oxl:oxl . .
RUN oxl build -o /tmp/app

FROM ubuntu:24.04
RUN apt-get update && apt-get install -y --no-install-recommends libstdc++6 liburing2 libsqlite3-0 libssl3t64 libnghttp2-14 ca-certificates \
    && rm -rf /var/lib/apt/lists/*
COPY --from=build /tmp/app /usr/local/bin/app
USER 1000
ENTRYPOINT ["app"]

Уже hello world линкуется с liburing, libsqlite3, libssl/libcrypto, libnghttp2 и libstdc++ (проверено ldd в образе); libpq5 (с зависимостями Kerberos / LDAP) добавляют программы с PostgreSQL. Пакеты библиотек рантайма: liburing2, libsqlite3-0, libpq5, libssl3t64, libnghttp2-14, libpcre2-8-0, zlib1g; ставьте то, что показывает ldd вашей программы (ca-certificates — для TLS-клиентов).

Dev-контейнер#

docker/devcontainer/devcontainer.json репозитория — шаблон: скопируйте его в <проект>/.devcontainer/devcontainer.json и выберите в VS Code «Reopen in Container». Он использует full-образ, монтирует проект в /work и том oxl-cache для кэша, передаёт --cap-add=SYS_PTRACE --security-opt seccomp=unconfined и просит расширение oxwaldlink.oxl-lang. Архив релиза содержит расширение как share/oxl/vscode/oxl-lang-<версия>.vsix; в образе оно доступно как /usr/local/share/oxl/oxl-lang.vsix. Dev-контейнеры ставят расширения по идентификатору, поэтому, если его нет в вашем Marketplace, один раз установите в терминале контейнера: code --install-extension /usr/local/share/oxl/oxl-lang.vsix.

Отладка#

oxl dap — прокси над lldb-dap-18 (full-образ). lldb нужен ptrace:

sh
docker run -it --rm -v "$PWD:/work" --cap-add=SYS_PTRACE --security-opt seccomp=unconfined ghcr.io/descaldnd/oxl bash

Для удалённой отладки из VS Code на хосте запустите адаптер на TCP-порту (oxl dap --listen [host:]port, см. oxl dap --help) и опубликуйте порт:

sh
docker run -it --rm -p 127.0.0.1:4711:4711 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v "$PWD:/work" \
    ghcr.io/descaldnd/oxl oxl dap --listen 0.0.0.0:4711

Конфигурация запуска на хосте: {"type": "oxl", "request": "launch", "name": "Container", "connect": {"host": "127.0.0.1", "port": 4711}, "program": "/work/app"} (короткая форма — "debugServer": 4711); program и другие пути — пути внутри контейнера. С --once адаптер завершается после первой сессии. См. VS Code.

Адаптер отладки запускает программы: публикуйте порт только на 127.0.0.1 или в доверенной сети.

io_uring, seccomp, лимиты#

  • Рантайм использует io_uring, если ядро позволяет. Профиль seccomp по умолчанию в Docker 25+ и kernel.io_uring_disabled=1|2 заставляют io_uring_setup падать с EPERM; рантайм тогда переходит на блокирующий пул потоков (всё работает, ввод-вывод медленнее). oxl doctor показывает это предупреждением io-uring; разрешить: --security-opt seccomp=unconfined или профиль, допускающий io_uring_setup, io_uring_enter и io_uring_register.
  • Рантайм запускает по воркеру на каждый доступный процессу CPU; квоту CFS из --cpus он не читает. На большом хосте с --cpus=2 используйте --cpuset-cpus=0-1 или -e OXL_WORKERS=2 (oxl doctor: cpu-quota).
  • Для компиляции нужно 1-2 ГиБ памяти: не запускайте контейнер с -m меньше 1g (oxl doctor: memory-limit).
  • vm.max_map_count — настройка ядра хоста; стек каждой задачи занимает два отображения (oxl doctor: max-map-count).

Сборка образов самостоятельно#

Образы собираются из архива релиза; ничего не скачивается:

sh
scripts/package_release.sh 1.0.0-beta                       # dist/oxl-1.0.0-beta-linux-x86_64.tar.xz (--no-docs --no-pdf --no-vsix: быстро)
scripts/docker_build.sh dist/oxl-1.0.0-beta-linux-x86_64.tar.xz --tag-prefix ghcr.io/descaldnd/oxl

Скрипт собирает обе цели docker/Dockerfile, запускает в каждом образе scripts/docker_test.sh (oxl --version, oxl doctor, oxl new и oxl test, собранная программа, программа с sqlite и сервис, которые линкуются, lldb-dap и рукопожатие oxl dap) и печатает размеры. Ничего не публикуется.

OxL 1.0.0-beta · Версия документации 1.0.0-beta© OxwaldLink · сгенерировано из Стандарта, исходников std и руководства