I am trying to deploy my docker-based project, which encompasses multiple services (django, postgres, celery, redis, flower). I would like to use my Redis instance with two separate databases.
On my local machine I achieve this via the env vars CELERY_BROKER_URL=redis://redis:6379/1
and CACHE_URL redis://redis:6379/2
.
For deployment on render, I tried the following in my render.yaml
file
- key: REDIS_URL
fromService:
name: redis
type: redis
property: connectionString
- key: CELERY_BROKER_URL
value: ${REDIS_URL}/1
- key: CACHE_URL
value: ${REDIS_URL}/2
However, as I’ve read later in the docs, variable interpolation does not work in render.yaml files yet and a workaround is to write start script that does the variable interpolation.
So I wrote the following redis_setup.sh
script:
#!/bin/bash
# Get the Redis URL
BASE_URL=$REDIS_URL
# Create new environment variables with database numbers
export CELERY_BROKER_URL="${BASE_URL}/1"
export CACHE_URL="${BASE_URL}/2"
# Print the environment variables to verify they are set correctly
echo "Environment variables set:"
echo "BASE_URL: $BASE_URL"
echo "CELERY_BROKER_URL: $CELERY_BROKER_URL"
echo "CACHE_URL: $CACHE_URL"
which is then executed by the following startup.sh
script:
#!/bin/bash
. /redis_setup.sh
python manage.py migrate
python manage.py collectstatic --noinput
exec gunicorn config.wsgi
which I use in the render.yaml
, in the web
service in dockerCommand: "/startup.sh"
When I check the logs of my web
service after a deployment, I can see the values of CELERY_BROKER_URL
and CACHE_URL
printed out as expected as interpolated strings but I can’t see them in the “Environment Variables” in the dashboard on Tender nor if I start a shell session and run printenv
nor can I access them in any other way.
What am I missing? How can I have Render pick up the two environment variables created in the script?
Many thanks in advance!