diff --git a/docker/openstack-accounting/Dockerfile b/docker/openstack-accounting/Dockerfile
new file mode 100644
index 00000000..579fd482
--- /dev/null
+++ b/docker/openstack-accounting/Dockerfile
@@ -0,0 +1,5 @@
+FROM registry.cern.ch/cmsmonitoring/cmsmon-py:test
+
+# Copy only the specific files you need instead of cloning entire repos
+COPY src/ ./
+
diff --git a/docker/openstack-accounting/README.md b/docker/openstack-accounting/README.md
new file mode 100644
index 00000000..f1135c47
--- /dev/null
+++ b/docker/openstack-accounting/README.md
@@ -0,0 +1,3 @@
+# Openstack Accounting cron job
+
+Code base of the Docker image used for the openstack-accounting cronjob, which generates data about Openstack usage from different groups and publishes it in the [Openstack Quotas And Usage Monitoring website](https://cmsdatapop.web.cern.ch/cmsdatapop/eos_openstack/openstack_accounting.html) of the CMS Data Popularity service.
diff --git a/docker/openstack-accounting/src/cron4openstack_accounting.sh b/docker/openstack-accounting/src/cron4openstack_accounting.sh
new file mode 100755
index 00000000..ebb3434e
--- /dev/null
+++ b/docker/openstack-accounting/src/cron4openstack_accounting.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+##H Script to create CMS Eos path sizes with conditions
+##H CMSVOC and CMSMONITORING groups are responsible for this script.
+set -e
+TZ=UTC
+myname=$(basename "$0")
+script_dir="$(cd "$(dirname "$0")" && pwd)"
+# Get nice util functions
+. "${script_dir}"/utils.sh
+
+# Do not change the order of "--output_file"([0],[1]) which is replaced in K8s run
+py_input_args=(
+ --output_file "/eos/user/c/cmsmonit/www/eos_openstack/openstack_accounting.html"
+ --summary_json "/eos/cms/store/accounting/openstack_accounting_summary.json"
+ --static_html_dir "${script_dir}/html"
+)
+
+# ---------------------------------------------------------------------------------------------------------- Run in K8S
+if [ -n "$K8S_ENV" ]; then
+ # $1: output
+ # Replace static output file with user arg for testability.
+ py_input_args[1]=$1
+
+ util4logi "${myname} is starting.."
+ util_cron_send_start "$myname" "1h"
+
+ util_kerberos_auth_with_keytab /etc/secrets/keytab
+ python3 "${script_dir}"/openstack_accounting.py "${py_input_args[@]}" 2>&1
+
+ util_cron_send_end "$myname" "1h" "$?"
+ util4logi "${myname} successfully finished."
+ exit 0
+ # break
+fi
+# Run in LxPlus for test ----------------------------------------------------------------------------------------------
+
+. /cvmfs/sft.cern.ch/lcg/views/LCG_101/x86_64-centos7-gcc8-opt/setup.sh
+
+# Catch output to not print successful jobs stdout to email, print when failed
+output=$(pip install --user schema 2>&1)
+ec=$?
+if [ $ec -ne 0 ]; then
+ echo "$output" - exit code: $ec
+ exit $ec
+fi
+
+if ! [ "$(python -c 'import sys; print(sys.version_info.major)')" = 3 ]; then
+ echo "It seem python version is not 3.X! Exiting..."
+ exit 1
+fi
+
+# Catch output to not print successful jobs stdout to email, print when failed
+output=$(python "{$script_dir}"/openstack_accounting.py "${py_input_args[@]}" 2>&1)
+ec=$?
+if [ $ec -ne 0 ]; then
+ echo "$output" - exit code: $ec
+ exit $ec
+fi
diff --git a/docker/openstack-accounting/src/html/main.html b/docker/openstack-accounting/src/html/main.html
new file mode 100644
index 00000000..800bdc56
--- /dev/null
+++ b/docker/openstack-accounting/src/html/main.html
@@ -0,0 +1,227 @@
+
+
+