How to add customisations done in one container into image

Hi Everyone,
Do u know how to transfer customisation from one container to another

I did install hrms on docker and it now works absolutely fine,

this is the docker-compose.yml file

version: “3”

services:
backend:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: on-failure
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

configurator:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: none
entrypoint:
- bash
- -c
# add redis_socketio for backward compatibility
command:
- >
ls -1 apps > sites/apps.txt;
bench set-config -g db_host $$DB_HOST;
bench set-config -gp db_port $$DB_PORT;
bench set-config -g redis_cache “redis://$$REDIS_CACHE”;
bench set-config -g redis_queue “redis://$$REDIS_QUEUE”;
bench set-config -g redis_socketio “redis://$$REDIS_QUEUE”;
bench set-config -gp socketio_port $$SOCKETIO_PORT;
environment:
DB_HOST: db
DB_PORT: “3306”
REDIS_CACHE: redis-cache:6379
REDIS_QUEUE: redis-queue:6379
SOCKETIO_PORT: “9000”
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

create-site:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: none
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
entrypoint:
- bash
- -c
command:
- >
wait-for-it -t 120 db:3306;
wait-for-it -t 120 redis-cache:6379;
wait-for-it -t 120 redis-queue:6379;
export start=date +%s;
until [[ -n grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty" ]] &&
[[ -n grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty" ]] &&
[[ -n grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty" ]];
do
echo “Waiting for sites/common_site_config.json to be created”;
sleep 5;
if (( date +%s-start > 120 )); then
echo “could not find sites/common_site_config.json with required keys”;
exit 1
fi
done;
echo “sites/common_site_config.json found”;
bench new-site --no-mariadb-socket --admin-password=admin --db-root-password=admin --install-app erpnext --set-default site.local;

db:
image: mariadb:10.6
healthcheck:
test: mysqladmin ping -h localhost --password=admin
interval: 1s
retries: 15
deploy:
restart_policy:
condition: on-failure
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
- --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
environment:
MYSQL_ROOT_PASSWORD: admin
volumes:
- db-data:/var/lib/mysql

frontend:
image: frappe/erpnext:v15.19.1
depends_on:
- websocket
deploy:
restart_policy:
condition: on-failure
command:
- nginx-entrypoint.sh
environment:
BACKEND: backend:8000
FRAPPE_SITE_NAME_HEADER: site.local
SOCKETIO: websocket:9000
UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
UPSTREAM_REAL_IP_RECURSIVE: “off”
PROXY_READ_TIMEOUT: 120
CLIENT_MAX_BODY_SIZE: 50m
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
ports:
- “8080:8080”

queue-long:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: on-failure
command:
- bench
- worker
- --queue
- long,default,short
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

queue-short:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: on-failure
command:
- bench
- worker
- --queue
- short,default
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

redis-queue:
image: redis:6.2-alpine
deploy:
restart_policy:
condition: on-failure
volumes:
- redis-queue-data:/data

redis-cache:
image: redis:6.2-alpine
deploy:
restart_policy:
condition: on-failure
volumes:
- redis-cache-data:/data

scheduler:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: on-failure
command:
- bench
- schedule
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

websocket:
image: frappe/erpnext:v15.19.1
deploy:
restart_policy:
condition: on-failure
command:
- node
- /home/frappe/frappe-bench/apps/frappe/socketio.js
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

volumes:
db-data:
redis-queue-data:
redis-cache-data:
sites:
logs:

and did customizations in it( Added doctypes, customised existing doctypes, added API end points)

I wanted to export all these changes to a new system so i commited the docker image and did push it to dockerhub, when i pulled the images and ran the same yml file in which the image reference i changed into my images

This was the thing i found out from this FAQ

How to update?

Change the image tag for all the frappe framework services, take down all the containers and start them again with new images. Once the containers are running you’ll need to migrate sites with bench --site all migrate command. The image and container replacement is done as per the container orchestrator.

But when i do this I dont get the customistaions refelect in the new container

Im i doing things wrong or is there any other step I didnt do, because of which im not getting the updates,

I didnt do mounts or didnt touch any volumes, I did refer to docker official documentations and found out that the customistaions in my container will be stored in those voulmes, here in my case its not being used so, i guess thats the problem but now I dont know to do this export and import business in ERPnext

Im new to Frappe and Docker Please help me!!

Hi, @sneha

you need to ensure that all your changes, including custom doctypes, customized existing doctypes, and added API endpoints, are properly migrated. These changes are stored in the database and possibly in the sites directory, which includes custom scripts and other site-specific files.

* Backup your database and custom app fixtures.
* Commit and push your Docker image.
* Pull the image on the new system and update `docker-compose.yml`.
* Restore the database and run migrations.

Backup Your Customizations

docker exec -it <container_id> bench --site <your_site_name> backup --with-files

Export Custom App (if any): If you created a custom app, make sure to export it from the current setup.

docker exec -it <container_id> bench export-fixtures

Commit and Push Docker Image

  1. Commit Docker Image:

    docker commit <container_id> your_dockerhub_username/your_image_name:tag

Push Docker Image to Docker Hub

docker push your_dockerhub_username/your_image_name:tag

Pull and Setup on New System

docker pull your_dockerhub_username/your_image_name:tag

Run Docker Containers with Updated Image: Update your docker-compose.yml file to use your custom Docker image and then run it.

Run the Containers

docker-compose up -d

Restore Backups

  1. Copy Backup Files: Copy the backup files to the appropriate location in your new container. You can use docker cp for this purpose.

Restore Database

   docker exec -it <new_container_id> bench --site <your_site_name> restore /path/to/database/file

Run Migration

  docker exec -it <new_container_id> bench --site all migrate

Hope it helps.