Справочная информация:
Мне нужно разработать Dockerfile.
Но перед этим я хочу выбрать базовый образ и запустить базу контейнеров на этом базовом образе.
После запуска контейнера я хотел бы попробовать установить некоторые пакеты, а также изменить некоторые настройки моей службы. Если все сделано вручную, наконец, я могу переместить все эти шаги: установить и настроить параметры пакета (что сработало вручную, попробуйте) в мой Dockerfile.
Проблема:
Иногда, после того, как я выполнил много правильных шагов, сделать неправильную настройку. Что еще хуже, я останавливаю контейнер и снова запускаю контейнер, чтобы доказать, что стартовый скрипт в порядке или нет.
Но, к сожалению, контейнер уже не может быть запущен из-за неправильной настройки приложения в контейнере.
На самом деле, я хочу попробовать другую конфигурацию в контейнере, и тогда, возможно, все будет хорошо, но у меня больше нет возможности снова войти в контейнер. Я не хочу перезагружать новый контейнер, потому что я уже выполнил много ручных операций в старом контейнере (я не переместил правильные шаги в Dockerfile, потому что я на стадии разработки, я хочу сделать это после того, как докажу, что все ок)
Далее приведен минимальный пример, показывающий мой случай:
Dockerfile:
FROM alpine
ADD ./docker-entrypoint.sh .
RUN chmod 777 ./docker-entrypoint.sh
ENTRYPOINT ["./docker-entrypoint.sh"]
docker-entrypoint.sh:
#!/bin/sh
touch /tmp/app.log
tail -f /tmp/app.log
Что я буду делать с выше:
docker build --no-cache -t try .
docker run -idt --name me try
docker exec -it me /bin/sh
Изменить docker-entrypoint.sh
на следующее:
#!/bin/sh
exit 0
touch /tmp/app.log
tail -f /tmp/app.log
Тогда:
docker stop me
docker start me # the container will not start
А теперь я знаю, exit 0
может быть, неправильная команда или неправильная конфигурация, я хочу повторить попытку с другими вещами, но без шансов.
Снова хочу отметить :
Я не хочу перезагружать контейнер, потому что в старом контейнере я уже многое сделал вручную, не только exit 0
.
И, supervisord
тоже не то, что мне было нужно в моем жизненном цикле разработки, я просто хочу упростить ситуацию. Что-то вроде изменения entrypoint for an already existed container
(кажется, просто работает для docker run
)
Есть ли у меня какие-либо предложения по упрощению этапа разработки?