Docker, лекция 6. Игнорирование файлов при сборке

Docker, лекция 6. Игнорирование файлов при сборке

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

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

Пример

Dockerfile копирует рабочий каталог в образ Docker. В результате это может включать потенциально конфиденциальную информацию, такую ​​как файл паролей, которым мы хотели бы управлять за пределами изображения. Добавим файл passwords.txt с нашим условным паролем, а так же напишем Dockerfile:

FROM alpine
ADD . /app
COPY cmd.sh /cmd.sh
CMD ["sh", "-c", "/cmd.sh"]

Соберем образ и посмотрим файлы в нем (сюрприз — файл passwords.txt будет в контейнере):

docker build -t password .
docker run password ls /app

Как игнорировать файл?

Следующая команда включит passwords.txt в файл .dockerignore и гарантирует, что он случайно не окажется в контейнере.

echo passwords.txt >> .dockerignore

Файл игнорирования поддерживает каталоги и регулярные выражения для определения ограничений, очень похожих на .gitignore у git.

Этот файл также можно использовать для уменьшения времени сборки, что будет рассмотрено позже. Соберем образ, теперь файла с паролем быть не должно.

docker build -t nopassword .

Если вам нужно использовать пароли как часть команды RUN, вам нужно скопировать, выполнить и удалить файлы как часть одной команды RUN. Внутри образа сохраняется только конечное состояние контейнера Docker.

Улучшаем время сборки

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

Для примера создадим файл в 100 МБ, например big-temp-file.img и соберем образ. Это уже займет намного больше времени, чем обычно.

docker build -t large-file-context .

Так же целесообразно игнорировать каталоги .git вместе с зависимостями, которые загружаются /создаются в образе, такими как node_modules. Они никогда не используются приложением, работающим в Docker-контейнере, а просто добавляют издержки процессу сборки.

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

echo big-temp-file.img >> .dockerignore
docker build -t no-large-file-context .

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *