---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/reference/docker/init-scripts.md
  - https://ydb.tech/docs/ru/reference/docker/init-scripts.md
sourcePath: ru/core/reference/docker/init-scripts.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# Пользовательские скрипты инициализации

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

## Директории для скриптов

Существуют две директории для размещения пользовательских скриптов:

| Директория     | Описание                                                                                                                     | Использование                                                                                                                                                                                                                 |
|----------------|------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `/preinit.d`   | Скрипты в этой директории выполняются при каждом запуске контейнера, **до** запуска сервера YDB.           | Выполняются при каждом запуске контейнера до запуска сервера. Полезны для установки переменных окружения, настройки логирования или других подготовительных задач, которые могут выполняться при каждом запуске контейнера.   |
| `/init.d`      | Скрипты в этой директории выполняются только **один раз** после успешного запуска сервера YDB. Создаётся файл-маркер для предотвращения повторного выполнения при перезапуске контейнера. | Выполняются только один раз после успешного запуска сервера. Например, для создания структуры базы данных (таблиц, индексов) и вставки начальных данных.                                                                          |

## Поддерживаемые типы файлов

### Скрипты предварительной инициализации (`/preinit.d`)

| Расширение | Описание |
|---|---|
| `.sh` | Shell-скрипты. Если скрипт исполняемый, он запускается напрямую. В противном случае он [подключается (sourced)](https://bash.cyberciti.biz/guide/Source_command), что позволяет модифицировать переменные окружения для последующих скриптов. |

### Скрипты инициализации (`/init.d`)

| Расширение | Описание |
|---|---|
| `.sh` | Shell-скрипты. Если скрипт исполняемый, он запускается напрямую. В противном случае он [подключается (sourced)](https://bash.cyberciti.biz/guide/Source_command). |
| `.sql` | SQL-файлы. Содержимое выполняется через интерфейс командной строки YDB YQL. |
| `.sql.gz` | Сжатые SQL-файлы в формате gzip. Содержимое распаковывается и выполняется. |

## Порядок выполнения

Скрипты выполняются в алфавитном порядке внутри каждой директории. Используйте числовые префиксы для управления последовательностью выполнения:

```text
/init.d/
├── 01-create-tables.sh
├── 02-create-indexes.sql
└── 03-insert-data.sql.gz
```

## Переменные окружения

Вы можете настроить директории скриптов с помощью переменных окружения:

| Переменная | Значение по умолчанию | Описание |
|---|---|---|
| `YDB_PREINITSCRIPTS_DIR` | `/preinit.d` | Путь к директории скриптов предварительной инициализации |
| `YDB_INITSCRIPTS_DIR` | `/init.d` | Путь к директории скриптов инициализации |

## Обработка ошибок

Если какой-либо скрипт завершается с ошибкой (возвращает ненулевой код), контейнер прекращает выполнение и завершается с ошибкой. Это гарантирует немедленное обнаружение ошибок инициализации и предотвращает запуск контейнера с незавершённой настройкой.

## Примеры

### Использование shell-скриптов


Создайте файл `/init.d/01-setup.sh` для настройки базы данных и заполните следующим содержимым:

```bash
#!/bin/bash
# /init.d/01-setup.sh
echo "Настройка базы данных..."
/ydb -e grpc://localhost:2136 -d /local --no-discovery sql -s "CREATE TABLE test (id Uint64, PRIMARY KEY (id));"
```

Примонтируйте директорию init при запуске контейнера:

```bash
docker run -d \
    --name ydb-local \
    -v $(pwd)/init.d:/init.d \
    ydbplatform/local-ydb:latest
```

При запуске контейнера автоматически создастся таблица — `test` с использованием YDB CLI. Скрипт выполняется только один раз после успешного старта сервера.


### Использование SQL-файлов

Создайте файл `/init.d/01-create-tables.sql` с содержимым:

```sql
-- /init.d/01-create-tables.sql
CREATE TABLE users (
    id Uint64,
    name Utf8,
    email Utf8,
    PRIMARY KEY (id)
);

CREATE TABLE orders (
    id Uint64,
    user_id Uint64,
    amount Double,
    PRIMARY KEY (id)
);
```

Примонтируйте директорию init при запуске контейнера:

```bash
docker run -d \
    --name ydb-local \
    -v $(pwd)/init.d:/init.d \
    ydbplatform/local-ydb:latest
```

При запуске контейнера автоматически создадутся две таблицы — `users` и `orders` — с помощью SQL-скрипта. Скрипт выполняется только один раз после успешного старта сервера.

### Восстановление из резервной копии с помощью init-скриптов

Создайте файл `/init.d/01-restore-backup.sh` с содержимым:

```bash
# /init.d/01-restore-backup.sh
#!/bin/bash
if [ -d "/backup" ] && [ -n "$(ls -A /backup)" ]; then
    /ydb -e grpc://localhost:2136 -d /local --no-discovery tools restore -p . -i /backup
fi
```

Смонтируйте директории init, а также том с вашей резервной копией при запуске контейнера:

```bash
docker run -d \
    --name ydb-local \
    -v $(pwd)/init.d:/init.d \
    -v $(pwd)/backup:/backup \
    ydbplatform/local-ydb:latest
```

При запуске контейнера произойдет восстановление из резервной копии `/backup` в базу данных `/local`. Скрипт выполняется только один раз после успешного старта сервера.

### Использование скриптов предварительной инициализации

Создайте файл `/preinit.d/01-set-env.sh` с содержимым:

```bash
# /preinit.d/01-set-env.sh
# Этот скрипт будет подключён (sourced), поэтому экспортированные переменные будут доступны
export YDB_DEFAULT_LOG_LEVEL=INFO
```

Примонтируйте директорию preinit при запуске контейнера:

```bash
docker run -d \
    --name ydb-local \
    -v $(pwd)/preinit.d:/preinit.d \
    ydbplatform/local-ydb:latest
```

При запуске контейнера экспортируется переменная окружения `YDB_DEFAULT_LOG_LEVEL` со значением `INFO`. Скрипт выполняется при каждом запуске контейнера.