Docker. Делаем аналог виртуальной машины из образа
Часто, тестируя проект или собирая очередной докер образ, хочется протестить его работу в чистом окружении. Если бы речь шла о каком-нбудь сервисе, то тут все просто - мы добавляем в Dockerfile:
CMD ["./do_the_monkey_twist.sh"]
и все прекрасно работает. Сервис бесконечно гоняет свой цикл сообщений, докер контейнер доступен извне через:
docker exec -it container_name bash
Однако, если же речь идет о простом приложении, которое просто выполняет определенную команду и после завершает свою работу, то мы сталкиваемся с проблемой - после выполнения команды контейнер закрывается. И ничего с ним не сделаешь, разве что по новой запускать очередную команду.
В качестве одного из способов решения такой проблемы можно добавить в Dockerfile следующую строчку:
CMD ["tail", "-f", "dev/null"]
Таким образом, при очередном запуске контейнера через:
container_name=$(docker run -d image_name)
docker exec -it $container_name bash
мы получим аналог виртуальной машины. К ней можно будет подключиться в любой момент и делать внутри нее все, что душе угодно.
Пример
Сделаем виртуальную машину с debian:jessie.
Создаем Dockerfile со следующим содержимым:
FROM debian:jessie
CMD ["tail", "-f", "dev/null"]
Собираем образ:
docker build . -t jessie
Запускам образ и подключаемся к нему:
container=$(docker run -d jessie)
docker exec -it $container bash
Напомню, что увидеть список контейнеров определенного образа можно с помощью следующей команды:
docker ps -f "ancestor=jessie"
Профит!