Automate the management of a Docker-based installation of Ghost CMS on a single server.

Table of Contents

Suppose you're a web enthusiast who manages multiple Ghost CMS instances on a single server using Docker. In that case, we have a comprehensive guide to help you automate the installation and management process with ease.

We have created a bash script that will streamline the process and save you valuable time and effort. We'll also show you how to set up cron jobs for different periods to ensure your Ghost CMS instances are always up-to-date and optimized.

This script will work if you manage your docker containers using docker-compose

Ghost CMS Installation with Docker:

Before diving into automation, it's essential to have your Ghost CMS instances set up using Docker. For a step-by-step installation guide, check out our informative blog post here:

Install ghost with docker + MySQL 8 [New Install]
Ghost is dropping support for MySQL5 for the next major release. If you are thinking to install ghost 4.x.x via docker choosing MySQL 8 would be a wise decision to avoid issues with future updates of the ghost version. Ghost is already pushing a notice to, those who

Understanding the Script:

The bash script streamlines Docker container management in four essential steps:

  1. Pulls the latest images for each Docker container.
  2. Stops and removes all existing containers.
  3. Restarts the containers with the latest images.
  4. Prunes unused Docker images, reclaiming valuable disk space.

How the Script Works:

The script works on a directory structure where each Docker container resides within its own folder.

For Example; You have a folder called containers as the root folder & within that folder it contains all your docker-containers compose files such as,

  - conainer1 
    -- docker-compose.yaml
  - conainer2 
    -- docker-compose.yaml
  - conainer3 
    -- docker-compose.yaml

Setting Up the Script:

Follow these straightforward steps to set up the script on your system:

Step 1: Create the Script File:

Using your preferred text editor, create a new file with .sh extension ( )


and paste the below codes into it.


# Change directory to your Main-folder
cd /path/to/Main-folder

# List all directories inside Main-folder
containers=$(ls -d */)

# Pull the latest images for each container
for container in $containers
  cd "$container"
  docker-compose pull
  cd ..

# Stop and remove all containers
for container in $containers
  cd "$container"
  docker-compose down
  cd ..

# Restart all containers
for container in $containers
  cd "$container"
  docker-compose up -d
  cd ..

# Prune all unused images
docker image prune -f

Step 2: Customizing the Script:

Adjust the script by replacing /path/to/Main-folder with the actual path to your Docker container directory containing your Ghost CMS instances.

Step 3: Grant Execute Permission:

Ensure the script is executable with the following command:

chmod +x

Step 4: Manual Execution:

You can now execute the script manually using the following command:


Automate with Cron Jobs (optional):

If you want to set up cron jobs to automate the script execution at specific intervals, follow the steps:

In the terminal, type the following command to open the cron job configuration file:

crontab -e

Add the desired cron job entry to run the script at your preferred frequency. For example, to run the script every day at midnight, use this line:

0 0 * * * /path/to/your/

To run the script every hour, use:

0 * * * * /path/to/your/

To run the script once a week, use:

0 0 * * 0 /path/to/your/

For a monthly update, set up this cron job entry:

0 0 1 * * /path/to/your/
Learn more about the scheduling references Here

Save your changes and exit the editor. The cron job is now set up to automatically execute the script according to the defined schedule.

By automating the installation and management of Ghost CMS instances with a bash script. Use cron jobs for automatic updates and optimizations. Take control of your Dockerized environment with ease.

We wish you happy ghost-blogging!InsertRephrase