Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!18.01.2024
Docker як обгортка для команд
Зазвичай ми дивимось на Docker як на квазівіртуальну машину зі якимось сталим процесом всередині. Проте за бажанням в Docker можна запустити і єдину команду, причому ззовні це мало відрізняється від іншої консольної команди.
Навіщо таке може бути потрібне? Насправді багато є варіантів, які зводяться до запуску програм в оточенні Linux, та, можливо, архітектури процесора, що відрізняється від рідної. З огляду на те, що на серверах у всіх Linux, а на робочих машинах — переважно не Linux, це досить корисна можливість.
Наприклад, через Docker дуже легко виконати кроскомпіляцію коду. В деяких випадках не тільки легко, а і єдиний можливий випадок — наприклад, з macOS в Linux зі зміною архітектури. Або є деякий пакет для Linux, в якого є утиліта, яка потрібна на робочій машині — таке теж легко.
До контейнера можна примонтувати всі файли та директорії, які потрібні, причому Docker не буде їх копіювати, а зробить доступними через віртуальну файлову систему (яка, маю признати, на macOS працює трохи повільніше, ніж нормальна.)
Вся команда виглядає так (тут опція --rm
видаляє контейнер по завершенню, а решта, сподіваюсь, зрозуміла:)
docker run --rm \
--mount type=bind,source='$(shell pwd)',target=/mnt \
--mount type=bind,source='$(shell go env GOCACHE)',target=/tmp/gocache \
--env GOCACHE=/tmp/gocache \
buildpack-deps:latest \
make -C src/tool
Скажу більше, в мене така команда сидить всередині if
, який перевіряє: якщо ми на CI на Linux, то можна просто запустити make
локально; а якщо на macOS з Apple Silicon - тоді в Docker. Економно — наскільки це можливо — та прозоро для користувача.