Часто, тестируя проект или собирая очередной докер образ, хочется протестить его работу в чистом окружении. Если бы речь шла о каком-нбудь сервисе, то тут все просто - мы добавляем в 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"

Профит!