> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/docs/tools-and-integrations/container/good-practices.md).

# Хорошие практики

Мы настоятельно рекомендуем вам ознакомиться с [хорошими практиками Docker](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) чтобы помочь вам узнать лучший способ оптимизации вашего контейнера и его безопасности.

Вот несколько советов по оптимизации вашего контейнера для идеальной работы с Edgegap.

## Версионирование

Версионирование при сборке контейнера является важным аспектом его жизненного цикла, поскольку многие окружения не будут повторно загружать образ, если тег уже присутствует на машине.

### Тег *latest*

По умолчанию, когда вы запускаете команду сборки:

{% hint style="warning" %}
Для пользователей с ARM CPU (Mac M1, M2 и т.д.) добавьте `--platform linux/amd64`  опцию к вашей команде сборки.
{% endhint %}

```bash
docker build -t repo/example .
```

В результате этой сборки образу будет присвоен тег **latest**

Следующее даёт тот же самый результат:

```bash
docker build -t repo/example:latest .
```

Но имейте в виду, **latest** — это просто тег, как любой другой, и не всегда отражает вашу самую последнюю сборку.

Пример:

```bash
docker build -t repo/example:latest .
# внесите некоторые изменения в ваш код
docker build -t repo/example:0.1 .
```

Edgegap НЕ ОБНОВИТ ваш тег **latest** и версия **0.1** будет отставать от нового кода.

### Пример тегирования

Мы рекомендуем увеличивать или изменять вашу версию при каждой сборке образа, чтобы обеспечить корректное использование и избежать кеширования старой версии в системе. Если вы уже используете систему семантического версионирования или повышаете версию при каждой компиляции, то можно довольно легко автоматизировать процесс присвоения тега вашей сборке Docker.

Пример Bash-скрипта для сборки Dockerfile с соответствующей версией, которую вы передаёте аргументом.

Этот пример будет собирать с заданной версией, присваивать тег репозиторию и отправлять его (не забудьте сначала войти в систему, если вы используете приватный репозиторий).

```bash
#!/bin/bash

if [[ $# -ne 1 ]] ; then
    echo 'Аргумент не указан. Пожалуйста, укажите версию, с которой хотите собрать этот образ. --> пример: ./docker-build.sh 0.0.1'
    exit 1
fi

docker build -t my-repo/example:$1 .

docker tag my-repo/example:$1 registry.edgegap.com/my-repo/example:$1
docker push registry.edgegap.com/my-repo/example:$1
```

С этим скриптом вы теперь можете использовать версию сборки вашего приложения для корректного обращения к ней.

Пример: вы собираете новую версию игрового сервера **2021.01.29.1234**

```bash
# Из вашего CI/CD конвейера или вручную

./docker-build.sh 2021.01.29.1234
```

### Почему

Главная причина увеличивать тег при каждой сборке — предотвратить кеширование на Edge.

Чтобы иметь возможность запускать сервер за считанные секунды, мы предварительно загружаем образ и лишь при необходимости увеличиваем количество инстансов. Мы не можем гарантировать частоту политики Pull, поскольку загружаем образ только если он ещё не присутствует на Edge.

Так что по сути использование **latest** тега или любого постоянного тега может вызвать у вас проблемы при исправлении или отладке, поскольку вы будете обновлять сборку и деплоить её на Edgegap, но Edge не затянет новый *версию* вашего тега, так как он останется тем же.

Если вы никогда не использовали [семантическое версионирование](https://semver.org/), Edgegap настоятельно рекомендует вам ознакомиться с ним и применить это к версии сборки!
