Образы 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. Порты по умолчанию не публикуются.
Запуск#
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:
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:
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) и опубликуйте порт:
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).
Сборка образов самостоятельно#
Образы собираются из архива релиза; ничего не скачивается:
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) и печатает размеры. Ничего не публикуется.