Перейти к основному содержимому

Volumes

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

Для подключения конфигурационных файлов или добавления информации внутрь контейнера можно примонтировать папку с host-машины: --volume $(pwd)/postgres:/docker-entrypoint-initdb.d/.

Для персистентного хранения данных лучше создать Volume и примонтировать его при запуске контейнера --volume pg-data:/var/lib/postgresql/data.

$ docker volume create pg-data
$ docker volume ls
local pg-data

$ docker volume inspect pg-data
[
{
"CreatedAt": "2024-06-13T20:17:12Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/pg-data/_data",
"Name": "pg-data",
"Options": {},
"Scope": "local"
}
]

$ docker run -d \
--name postgres \
-p 5432:5432 \
-e POSTGRES_USER=program \
-e POSTGRES_PASSWORD=test \
-e POSTGRES_DB=services \
--volume pg-data:/var/lib/postgresql/data \
postgres:15

$ psql -h localhost -p 5432 -U program services
>> CREATE TABLE items (id SERIAL PRIMARY KEY, name VARCHAR NOT NULL);
>> INSERT INTO items(name) VALUES ('test');

$ docker rm -f postgres
$ docker run -d \
--name postgres \
-p 5432:5432 \
-e POSTGRES_USER=program \
-e POSTGRES_PASSWORD=test \
-e POSTGRES_DB=services \
--volume pg-data:/var/lib/postgresql/data \
postgres:15

$ psql -h localhost -p 5432 -U program services
>> SELECT * FROM items;
id | name
----+------
1 | test
(1 row)

Оптимизация размера образа

Образ — это не что иное, как коллекция других образов, можно прийти к очевидному выводу: размер образа равен сумме размеров образов, его составляющих.

$ docker history my-ping:v1.0
IMAGE CREATED CREATED BY SIZE COMMENT
be17399a7548 10 days ago CMD ["google.com"] 0B buildkit.dockerfile.v0
<missing> 10 days ago ENTRYPOINT ["/bin/ping"] 0B buildkit.dockerfile.v0
<missing> 10 days ago RUN /bin/sh -c apt-get update && apt-get… 59.3MB buildkit.dockerfile.v0
<missing> 8 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:63d5ab3ef0aab308c… 77.8MB
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 8 months ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 8 months ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 8 months ago /bin/sh -c #(nop) ARG RELEASE 0B

Каждая дополнительная инструкция в Dockerfile будет только увеличивать общий размер образа. Соответственно, чтобы уменьшить результирующий размер образа:

  • нужно объединять однотипные команды;
  • использовать максимально компактный базовый образ, например на базе Alpine Linux;
  • использовать multistage build, чтобы не тащить в результирующий образ лишнее.
  • использовать .dockerignore, чтобы исключить лишние файлы из сборки (синтаксис аналогичен .gitignore).