Add Docker bash exit prompt to prevent accidental data loss during container preparation
During the development of my Docker container image running on Ubuntu, I often type exit after making changes to my container, without also typing docker commit (from a separate shell session) to save the changes back to the container image. Since Docker containers are by default ephemeral, e.g. immutable or read-only, changes will be discarded upon exit unless docket commit is used. To prevent this, I add a prompt asking if the user really wants to exit. This way, at least, any changes won’t be accidentally lost just because the exit command is used.
Implementing such a prompt is trivial by editing ~/.bashrc which points to /home/.bashrc on my installation to implement a custom exit() function. The function will add a prompt (or in my case, a double prompt which asks the user to confirm twice) when exit is executed, and only proceed to exit if confirmation is received from the user:
exit() {
echo -n "Please commit all Docker changes first. Otherwise, all changes will be lost. Are you sure you want to exit? [y/N] "
read -n 1 -r REPLY
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Exit cancelled."
return
fi
echo -n "Waiting for a while before asking you again... "
sleep 10
echo -n "Again, please commit all Docker changes first. If not, you might lose data. Are you sure you want to exit? [y/N] "
read -n 1 -r REPLY
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Exit cancelled."
return
fi
# Call the original exit command
command exit
}
Save the changes by running docker commit (from a separate bash shell), then type exit to exit the Docker session. Start the Docker image again, for example with sudo docker run -ti –rm ubuntu /bin/bash, and type exit. You will be asked to confirm that you have already committed the changes, twice, before you can exit. The double prompt with a delay is needed to prevent me from habitually answering yes to the question:
This way, I can be sure that I will always remember to commit my changes before exiting, and that no changes will be lost simply because the session has been accidentally closed with the exit command.