wiki/docs/docker/Заметки.md
ilyamak04 bebdfecaf7
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 14s
+
2025-02-10 16:58:24 +03:00

115 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### Полезные источники
- [**Базовые команды 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 <image_name>:<tag>` значение переменной не посмотреть. Нельзя получить доступ к значению 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: |-
Это первая строка
Это вторая строка
### РЕЗУЛЬТАТ
Это первая строка
Это вторая строка
```