### Полезные источники - [**Базовые команды Docker**](https://github.com/python-dev-blog/docker-demo) - [**Базовые команды docker-compose**](https://github.com/python-dev-blog/docker-compose-demo) - [**Линтер для Docker**](https://github.com/hadolint/hadolint) ### Разное #### ARG [Статья](https://www.docker.com/blog/docker-best-practices-using-arg-and-env-in-your-dockerfiles/) `Аргументы сборки (ARG)` не сохраняются в конечном образе. ARG используется для передачи значений на этапе сборки. Эти значения доступны только во время сборки образа и не сохраняются в конечном образе. Также ARG не сохраняется в слоях образа, т.е. с помощью `docker history :` значение переменной не посмотреть. Нельзя получить доступ к значению ARG из финального образа. #### Как докер ищет образы? - Докер сначала проверяет есть ли образ с указанным именем и тегом локально на хосте (в кэше Docker) - Если образ не найден локально, докер ищет его в registry по умолчанию, то есть в Dockerhub, Docker пытается спуллить образ с докер хаб, если тэг не указан, Docker использует тег `latest` по умолчанию - Дальше Docker идет в настроенный Docker registry и ищет образ там, например, `image: registry.example.com/myimage:tag` - Если образ не найден и в docker-compose.yml указана секция build, Docker создаст образ локально из Dockerfile, который находится в указанной директории. Пример в docker-compose.yml: ```yaml services: myapp: build: context: . dockerfile: Dockerfile ``` Последовательность 1. Ищет локально на хосте. 2. Ищет на Docker Hub. 3. Ищет в частных реестрах (если указан). 4. Сборка из Dockerfile (если указана опция build в docker-compose.yml). #### В чём разница сежду ENTRYPOINT и CMD [Статья](https://www.docker.com/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/) ENTRYPOINT и CMD [] (без квадратных скобок оболочка будет использована) не использует оболочку для выполнения команды, команда передаётся напрямую процессу, то есть пайпы и всякие приблуды оболочки не работают Docker не запускает оболочку, а передает команду напрямую в процесс. CMD можно переопределить при запуске контейнера ```bash docker run image:tag comand ``` ENTRYPOINT задает команду, которая всегда будет выполняться при запуске контейнера. ENTRYPOINT используется для установки основной команды, которая должна быть выполнена, и она не может быть переопределена при запуске контейнера. - `ENTRYPOINT` задаёт команду, которая всегда будет выполняться. Она не должна быть переопределена при запуске контейнера. - `CMD` задаёт аргументы по умолчанию для `ENTRYPOINT`. Если `ENTRYPOINT` не указан, используется `CMD`, и `CMD` можно легко переопределить при запуске контейнера ```dockerfile ENV MY_VAR=Hello ENTRYPOINT ["sh", "-c", "echo $MY_VAR"] ``` ```dockerfile ENTRYPOINT ["nginx", "-g"] CMD ["daemon off;"] ``` #### Хэлфчеки Когда мы пишем ```yaml depends_on: postgresql-db: condition: service_healthy ``` Это значит что все хелфчеки к сервису (контейнеру) postgresql-db должны выполниться успешно, только после этого контейнер начнёт подниматься #### && Оператор `&&` в командах оболочки используется для цепочки команд, где следующая команда выполняется только если предыдущая выполнилась успешно (с кодом возврата 0). #### `>-` и `|-` Когда нужно указать много переменных окружения в compose можно использовать `>-` ``` text: >- Это первая строка Это вторая строка # РЕЗУЛЬТАТ Это первая строка Это вторая строка ``` ``` # Ещё пример environment: CATALINA_OPTS: >- -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -server -XX:+UseParallelGC -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.rmi.port=9000 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= ``` При использовании `|-` переносы строк сохраняются как есть ``` text: |- Это первая строка Это вторая строка ### РЕЗУЛЬТАТ Это первая строка Это вторая строка ```