# Лучшие практики

Мы настоятельно рекомендуем вам ознакомиться с [хорошими практиками 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 настоятельно рекомендует вам ознакомиться с ним и применить это к версии сборки!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/ru/docs/tools-and-integrations/container/good-practices.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
