Galaxy 25.0 in Docker - issues with gravity, supervisord, NGINX

Hi there,

I have installed Galaxy 25.0 on macOS and it went all right. Now I’m trying to install it within a Docker container and the sh run.sh falls into the following error:

FileNotFoundError: [Errno 2] No such file or directory: ‘/etc/galaxy/gravity.yml’

Docker engine: 28.4.0

Docker image: ubuntu:latest

Commands ran:

apt-get update && apt-get install -y python3 python3-venv git
git clone -b release_25.0 GitHub - galaxyproject/galaxy: Data intensive science for everyone.
cd galaxy
sh run.sh

second sh run.sh gave:


Requirement already satisfied: zstandard==0.23.0 in ./.venv/lib/python3.12/site-packages (from -r requirements.txt (line 220)) (0.23.0)
Trying to resolve path for the ‘email_ban_file’ option but it’s empty/None
The Galaxy client build is up to date and will not be rebuilt at this time.
Activating virtualenv at .venv
Traceback (most recent call last):
File “/galaxy/.venv/bin/galaxyctl”, line 8, in
sys.exit(galaxyctl())
^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1161, in call
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1082, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1697, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 788, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/decorators.py”, line 33, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/commands/cmd_update.py”, line 12, in cli
with process_manager.process_manager(**ctx.parent.cm_kwargs) as pm:
File “/usr/lib/python3.12/contextlib.py”, line 137, in enter
return next(self.gen)
^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/process_manager/init.py”, line 22, in process_manager
pm = ProcessManagerRouter(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/process_manager/init.py”, line 298, in init
self.config_manager = config_manager or ConfigManager(state_dir=state_dir,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 74, in init
self.auto_load()
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 409, in auto_load
self.load_config_file(os.path.abspath(config))
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 81, in load_config_file
with open(config_file) as config_fh:
^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: ‘/etc/galaxy/gravity.yml’
Executing: galaxy
Traceback (most recent call last):
File “/galaxy/.venv/bin/galaxy”, line 8, in
sys.exit(galaxy())
^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1161, in call
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1082, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 788, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/decorators.py”, line 33, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/cli.py”, line 84, in galaxy
return ctx.invoke(mod.cli, foreground=True, quiet=quiet)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/core.py”, line 788, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/click/decorators.py”, line 33, in new_func
return f(get_current_context(), *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/commands/cmd_start.py”, line 20, in cli
with process_manager.process_manager(foreground=foreground, **ctx.parent.cm_kwargs) as pm:
File “/usr/lib/python3.12/contextlib.py”, line 137, in enter
return next(self.gen)
^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/process_manager/init.py”, line 22, in process_manager
pm = ProcessManagerRouter(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/process_manager/init.py”, line 298, in init
self.config_manager = config_manager or ConfigManager(state_dir=state_dir,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 74, in init
self.auto_load()
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 409, in auto_load
self.load_config_file(os.path.abspath(config))
File “/galaxy/.venv/lib/python3.12/site-packages/gravity/config_manager.py”, line 81, in load_config_file
with open(config_file) as config_fh:
^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: ‘/etc/galaxy/gravity.yml’

I don’t even understand why /etc/galaxy is referenced since everything ig going under /galaxy.

Any help will be greatly appreciated.

Thanks!

Hey!

This might not help you at all since you are facing a different gravity error then I was, but I had to set a global env variable in my Dockerfile to fix issues with gravity:
GRAVITY_STATE_DIR=/tmp/galaxy/.gravity-state

Also, maybe check your settings for gravity in your galaxy.yml, maybe by setting galaxy_root.

Specify Galaxy config file (galaxy.yml), if the Gravity config is separate from the Galaxy config. Assumed to be the same file as the Gravity config if a galaxy key exists at the root level, otherwise, this option is required.
galaxy_config_file:

Specify Galaxy’s root directory. Gravity will attempt to find the root directory, but you can set the directory explicitly with this option.
galaxy_root: /galaxy

1 Like

Hi JBoom!

Thank you for your reply. Setting env variable within the running container didn’t help. However, taking care of gravity section in galaxy.yml file did! It went forward and after setting galaxy uid/gid, the server has been launched and listening.

Thanks again!

1 Like

Hi,

I try to sh run.sh in a Docker container with

gravity:

process_manager: supervisor

in the galaxy.yml file, but the starting process stops with supervisord is not running error.

Is there a way to make it started automatically? And is there any config files to fill out?

Thanks!

Docker engine: 28.4.0

Docker image: ubuntu:latest

After looking to further logs, I cans see:

supervisord started with pid 85

which means that at the end it started but I have no listening process, logs are:

The Galaxy client build is up to date and will not be rebuilt at this time.

Activating virtualenv at .venv

Removing supervisor configs: /galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/tusd_tusd.conf

Updating service gunicorn

supervisord is not running

supervisord is not running

Updating service celery

supervisord is not running

Updating service celery-beat

Executing: galaxy

2025-10-08 11:23:35,179 WARN No file matches via include “/galaxy/database/gravity/supervisor/supervisord.conf.d/*.conf”

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/celery-beat_celery-beat.conf” during parsing

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/celery_celery.conf” during parsing

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/gunicorn_gunicorn.conf” during parsing

Unlinking stale socket /galaxy/database/gravity/supervisor/supervisor.sock

2025-10-08 11:23:35,487 INFO RPC interface ‘supervisor’ initialized

2025-10-08 11:23:35,487 CRIT Server ‘unix_http_server’ running without any HTTP authentication checking

2025-10-08 11:23:35,487 INFO supervisord started with pid 85

2025-10-08 11:23:36,490 INFO spawned: ‘celery’ with pid 86

2025-10-08 11:23:36,492 INFO spawned: ‘celery-beat’ with pid 87

2025-10-08 11:23:36,494 INFO spawned: ‘gunicorn’ with pid 88

2025-10-08 11:23:46,532 INFO success: celery entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)

2025-10-08 11:23:46,532 INFO success: celery-beat entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)

2025-10-08 11:23:52,131 INFO success: gunicorn entered RUNNING state, process has stayed up for > than 15 seconds (startsecs)

After looking to further logs, I cans see:

supervisord started with pid 85

which means that at the end it started but I have no listening process, logs are:

The Galaxy client build is up to date and will not be rebuilt at this time.

Activating virtualenv at .venv

Removing supervisor configs: /galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/tusd_tusd.conf

Updating service gunicorn

supervisord is not running

supervisord is not running

Updating service celery

supervisord is not running

Updating service celery-beat

Executing: galaxy

2025-10-08 11:23:35,179 WARN No file matches via include “/galaxy/database/gravity/supervisor/supervisord.conf.d/*.conf”

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/celery-beat_celery-beat.conf” during parsing

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/celery_celery.conf” during parsing

2025-10-08 11:23:35,179 INFO Included extra file “/galaxy/database/gravity/supervisor/supervisord.conf.d/_default_.d/gunicorn_gunicorn.conf” during parsing

Unlinking stale socket /galaxy/database/gravity/supervisor/supervisor.sock

2025-10-08 11:23:35,487 INFO RPC interface ‘supervisor’ initialized

2025-10-08 11:23:35,487 CRIT Server ‘unix_http_server’ running without any HTTP authentication checking

2025-10-08 11:23:35,487 INFO supervisord started with pid 85

2025-10-08 11:23:36,490 INFO spawned: ‘celery’ with pid 86

2025-10-08 11:23:36,492 INFO spawned: ‘celery-beat’ with pid 87

2025-10-08 11:23:36,494 INFO spawned: ‘gunicorn’ with pid 88

2025-10-08 11:23:46,532 INFO success: celery entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)

2025-10-08 11:23:46,532 INFO success: celery-beat entered RUNNING state, process has stayed up for > than 10 seconds (startsecs)

2025-10-08 11:23:52,131 INFO success: gunicorn entered RUNNING state, process has stayed up for > than 15 seconds (startsecs)

OK seems that a process is listening on port 8080. I try to configure NGINX to handle both 443 SSL and uploads/downloads.

1 Like

Hi @breakthewall

Thanks for posting back what worked! Let’s merge all this together for anyone reading later on.

It sounds like you have this configured correctly now but we can follow up more. :slight_smile:

XRef: Private Galaxy Servers

With this doc likely the best one for the NGINX configuration → Proxying Galaxy with NGINX — Galaxy Project 25.0.3.dev0 documentation

Then, searching the README here with NGINX will find the relevant supplemental information for the Docker version of Galaxy → "GitHub - bgruening/docker-galaxy: 🐋📊📚 Docker Images tracking the stable Galaxy releases.