Перейти к основному содержимому

Сборка Docker-образов

примечание

Эта страница переведена при помощи нейросети GigaChat.

Данный документ содержит инструкции по сборке Docker-образов для OrioleDB, а также по их тестированию.

Предварительные требования

Перед началом работы необходимо убедиться, что Docker установлен на локальной машине. В противном случае, программу можно скачать и установить с официального сайта Docker: https://docs.docker.com/get-docker/.

docker -v

Быстрый старт

  1. Откройте терминал и перейдите в каталог проекта OrioleDB (если в нем еще не находитесь):

    cd path/to/orioledb
  2. Соберите (Alpine) PostgreSQL 17 с расширением OrioleDB:

    docker build -t orioletest:17 -f docker/Dockerfile --pull --network=host --progress=plain --build-arg PG_MAJOR="17" .
  3. Запустите сервер:

    docker run --name orioletest17 -v orioletest17data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=oriole123 -d orioletest:17
  4. Подключитесь к серверу через psql:

    docker exec -ti orioletest17 psql -U postgres

    Ожидается вывод, аналогичный следующему сообщению psql:

    psql (17.9 OrioleDB beta 16 PGTAG=patches17_20 alpine:3.21+clang build:2026-06-17T15:23:16+00:00 17.9)
    Type "help" for help.
    postgres=#
  5. Включите расширение orioledb:

    create extension if not exists orioledb;
  6. Проверьте работу некоторых команд:

    postgres=# select orioledb_version();
    orioledb_version
    ------------------
    OrioleDB beta 16
    (1 row)

    postgres=# CREATE TABLE oriole_test (a int) USING orioledb;
    CREATE TABLE
    postgres=# INSERT INTO oriole_test VALUES (1), (2);
    INSERT 0 2
    postgres=# SELECT * FROM oriole_test;
    a
    ---
    1
    2
    (2 rows)

    postgres=# VACUUM ANALYZE oriole_test;
    VACUUM

    postgres=# \d+ oriole_test
    Table "public.oriole_test"
    Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
    --------+---------+-----------+----------+---------+---------+-------------+--------------+-------------
    a | integer | | | | plain | | |
    Access method: orioledb

    postgres=# \d+
    List of relations
    Schema | Name | Type | Owner | Persistence | Access method | Size | Description
    --------+----------------------+-------+----------+-------------+---------------+------------+-------------
    public | oriole_test | table | postgres | permanent | orioledb | 8192 bytes |
    public | orioledb_index | view | postgres | permanent | | 0 bytes |
    public | orioledb_index_descr | view | postgres | permanent | | 0 bytes |
    public | orioledb_table | view | postgres | permanent | | 0 bytes |
    public | orioledb_table_descr | view | postgres | permanent | | 0 bytes |
    (5 rows)

    postgres=# \dx
    List of installed extensions
    Name | Version | Schema | Description
    ----------+---------+------------+------------------------------------------------------
    orioledb | 1.2 | public | OrioleDB -- the next generation transactional engine
    plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
    (2 rows)

    postgres=# \dx+ orioledb
    Objects in extension "orioledb"
    Object description
    --------------------------------------------------------------------------
    access method orioledb
    function orioledb_commit_hash()
    function orioledb_compression_max_level()
    function orioledb_evict_pages(oid,integer)
    function orioledb_get_evicted_trees()
    function orioledb_get_index_descrs()
    function orioledb_get_table_descrs()
    function orioledb_has_retained_undo()
    function orioledb_idx_structure(oid,text,character varying,integer)
    function orioledb_index_description(oid,oid,oid,text)
    function orioledb_index_oids()
    function orioledb_index_rows(oid)
    function orioledb_page_stats()
    function orioledb_parallel_debug_start()
    function orioledb_parallel_debug_stop()
    function orioledb_recovery_synchronized()
    function orioledb_relation_size(oid)
    function orioledb_sys_tree_check(integer,boolean)
    function orioledb_sys_tree_rows(integer)
    function orioledb_sys_tree_structure(integer,character varying,integer)
    function orioledb_table_description(oid)
    function orioledb_table_description(oid,oid,oid)
    function orioledb_table_oids()
    function orioledb_table_pages(oid)
    function orioledb_tableam_handler(internal)
    function orioledb_tbl_are_indices_equal(regclass,regclass)
    function orioledb_tbl_bin_structure(oid,boolean,integer)
    function orioledb_tbl_check(oid,boolean)
    function orioledb_tbl_compression_check(bigint,oid,integer[])
    function orioledb_tbl_indices(oid)
    function orioledb_tbl_structure(oid,character varying,integer)
    function orioledb_ucm_check()
    function orioledb_version()
    function orioledb_write_pages(oid)
    function pg_stopevent_reset(text)
    function pg_stopevent_set(text,jsonpath)
    function pg_stopevents()
    function s3_get(text)
    function s3_put(text,text)
    type orioledb_index
    type orioledb_index[]
    type orioledb_index_descr
    type orioledb_index_descr[]
    type orioledb_table
    type orioledb_table[]
    type orioledb_table_descr
    type orioledb_table_descr[]
    view orioledb_index
    view orioledb_index_descr
    view orioledb_table
    view orioledb_table_descr
    (51 rows)
  7. Выйдите из базы данных, выполнив команду \q.

  8. Остановите сервер:

    docker stop orioletest17
  9. Удалите контейнер:

    docker container rm orioletest17
  10. Удалите Docker-образ:

    docker rmi orioletest:17
  11. Удалите том с данными:

    docker volume rm orioletest17data

Сборка Docker-образов

Для сборки Docker-образа необходимо использовать одну из команд описанных ниже.

Для сборки PostgreSQL 17 + расширения OrioleDB

docker build -t orioletest:17 -f docker/Dockerfile --pull --network=host --progress=plain --build-arg PG_MAJOR="17" .

Для сборки PostgreSQL 16 + расширения OrioleDB

docker build -t orioletest:16 -f docker/Dockerfile --pull --network=host --progress=plain --build-arg PG_MAJOR="16" .

Поддерживаемые переменные окружения

Данный проект сохраняет совместимость с официальным Docker-образом PostgreSQL, поэтому поддерживает те же переменные окружения:

  • POSTGRES_PASSWORD;
  • POSTGRES_USER;
  • POSTGRES_DB;
  • POSTGRES_INITDB_ARGS;
  • POSTGRES_INITDB_WALDIR;
  • POSTGRES_HOST_AUTH_METHOD;
  • PGDATA.

Подробнее: https://github.com/docker-library/docs/blob/master/postgres/README.md

Доступные параметры сборки Docker

Полный список параметров сборки приведен в файлах Dockerfile:

  • Alpine Linux: ./Dockerfile:

    • поддерживаются [ edge 3.21 3.20 3.19 3.18 ];
    • пример: --build-arg ALPINE_VERSION="3.21" -f docker/Dockerfile ;
  • Ubuntu Linux: ./Dockerfile.ubuntu:

    • поддерживаются [ devel 25.04 24.10 24.04 22.04 plucky oracular noble jammy ];
    • пример: --build-arg UBUNTU_VERSION="24.04" -f docker/Dockerfile.ubuntu .

Другие важные параметры сборки:

  • --build-arg PG_MAJOR="17":

    • Выбор основной версии PostgreSQL. По умолчанию 17;
    • Доступные значения: 16, 17;
  • --build-arg BUILD_CC_COMPILER="gcc":

    • Выбор C-компилятора. По умолчанию clang;
    • Доступные значения: clang или gcc.

Например, для сборки образа с использованием Alpine версии 3.21, компилятора gcc и PostgreSQL версии 16 используется команда:

docker build --pull --network=host --progress=plain \
--build-arg ALPINE_VERSION="3.21" \
--build-arg BUILD_CC_COMPILER="gcc" \
--build-arg PG_MAJOR="16" \
-f docker/Dockerfile \
-t orioletest:16-gcc-alpine3.21 .

Для сборки образа с использованием Ubuntu версии devel, компилятора clang и PostgreSQL версии 17 используется команда:

docker build --pull --network=host --progress=plain \
--build-arg UBUNTU_VERSION="devel" \
--build-arg BUILD_CC_COMPILER="clang" \
--build-arg PG_MAJOR="17" \
-f docker/Dockerfile.ubuntu \
-t orioletest:17-clang-ubuntu-devel .

Версия devel является версией Ubuntu в разработке, поэтому она может быть нестабильной.

Экспериментальная сборка OrioleDB + расширения PostGIS

Известные ограничения: индексы OrioleDB gist, sp-gist и другие связанные типы индексов еще не поддерживаются.

  1. Создайте образ orioletest:17-gcc-alpine3.21:

    docker build --pull --network=host --progress=plain \
    --build-arg ALPINE_VERSION="3.21" \
    --build-arg BUILD_CC_COMPILER="gcc" \
    --build-arg PG_MAJOR="17" \
    -f docker/Dockerfile \
    -t orioletest:17-gcc-alpine3.21 .
  2. Соберите образ oriolegis:17-3.5-alpine. В новом каталоге выполнить команды:

    git clone --depth=1 https://github.com/postgis/docker-postgis.git
    cd ./docker-postgis/17-3.5/alpine
    docker build --network=host --progress=plain \
    --build-arg BASE_IMAGE=orioletest:17-gcc-alpine3.21 \
    -t oriolegis:17-3.5-alpine .

Заметки для разработчиков

Для сборки всех вариаций Docker-образов на локальной машине необходимо выполнить следующую команду:

  • ./ci/local_docker_matrix.sh;
  • или (экспериментально) ./ci/docker_matrix.sh --help.

Ubuntu

  • Поддерживаемые базовые образы (с обновлениями безопасности):

  • Поддерживаемые архитектуры базовых образов:

    • [ amd64, arm32v7, arm64v8, ppc64le, riscv64, s390x].

Alpine

  • Поддерживаемые базовые образы (с обновлениями безопасности):

  • Поддерживаемые архитектуры базовых образов:

    • [ amd64, arm32v6, arm32v7, arm64v8, i386, ppc64le, riscv64, s390x ].

macOS

В macOS может потребоваться установка bash и gnu-getopt из Homebrew. Для их установки выполните команду:

brew install bash gnu-getopt

Обновите /etc/shells:

echo /opt/homebrew/bin/bash >> /etc/shells

Может потребоваться обновление переменной PATH в файле .bashrc или .zshrc:

PATH=/opt/homebrew/bin:/opt/homebrew/opt/gnu-getopt/bin:$PATH

Прочее

  • Тестирование: При наличии возможности тестирования на архитектурах, отличных от amd64, пожалуйста, сообщите об этом!
  • Некоторые версии QEMU не могут эмулировать JIT в PostgreSQL. В этом случае необходимо использовать jit=off.
  • Безопасность: Следует учитывать, что порты, не привязанные к хосту (то есть -p 5432:5432 вместо -p 127.0.0.1:5432:5432), будут доступны извне. Это также применимо, если настроено блокирование этого конкретного порта через UFW, так как Docker управляет собственными правилами iptables. Подробнее При простом пароле и открытых портах существует риск заражения криптомайнерами!
  • Windows: При возникновении проблем рекомендуется использовать Windows Subsystem for Linux (WSL2).
  • Расширение текущих Docker-образов OrioleDB является сложной задачей. Невозможно использовать пакеты Ubuntu PostgreSQL (например: postgresql-16-mobilitydb) — требуется сборка из исходного кода.