e-scriptorium / Dockerfile
William Mattingly
Refactor Dockerfile to use a pre-built image, install necessary packages, and configure PostgreSQL and Redis services. Added supervisord for process management and initialization script for database setup. Updated entrypoint to start all services.
63441fa
FROM registry.gitlab.com/scripta/escriptorium:latest
WORKDIR /usr/src/app
# Install required packages
RUN apt-get update && apt-get install -y git postgresql postgresql-client redis-server supervisor && \
rm -rf /var/lib/apt/lists/* && \
git clone https://gitlab.com/scripta/escriptorium.git /tmp/escriptorium && \
cp /tmp/escriptorium/variables.env_example variables.env && \
rm -rf /tmp/escriptorium
# Configure PostgreSQL
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/13/main/pg_hba.conf && \
echo "listen_addresses='*'" >> /etc/postgresql/13/main/postgresql.conf
# Create supervisord configuration
RUN echo '[supervisord]\n\
nodaemon=true\n\
logfile=/var/log/supervisord.log\n\
logfile_maxbytes=50MB\n\
logfile_backups=10\n\
\n\
[program:postgresql]\n\
command=service postgresql start\n\
autostart=true\n\
autorestart=true\n\
\n\
[program:redis]\n\
command=service redis-server start\n\
autostart=true\n\
autorestart=true\n\
\n\
[program:uwsgi]\n\
command=uwsgi --ini /usr/src/app/uwsgi.ini\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
stdout_logfile=/var/log/uwsgi.log\n\
stderr_logfile=/var/log/uwsgi.err\n\
\n\
[program:daphne]\n\
command=daphne --bind 0.0.0.0 --port 5000 -v 1 escriptorium.asgi:application\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
stdout_logfile=/var/log/daphne.log\n\
stderr_logfile=/var/log/daphne.err\n\
\n\
[program:celery_default]\n\
command=celery -A escriptorium worker -l INFO -E -Ofair --prefetch-multiplier 1 -Q default -c 4 --max-tasks-per-child=10\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
\n\
[program:celery_live]\n\
command=celery -A escriptorium worker -l INFO -E -Ofair --prefetch-multiplier 1 -Q live -c 4 --max-tasks-per-child=10\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
\n\
[program:celery_low_priority]\n\
command=celery -A escriptorium worker -l INFO -E -Ofair --prefetch-multiplier 1 -Q low-priority -c 4 --max-tasks-per-child=10\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
\n\
[program:celery_gpu]\n\
command=celery -A escriptorium worker -l INFO -E -Ofair --prefetch-multiplier 1 -Q gpu -c 1 --max-tasks-per-child=1\n\
directory=/usr/src/app\n\
autostart=true\n\
autorestart=true\n\
' > /etc/supervisor/conf.d/escriptorium.conf
# Create initialization script
RUN echo '#!/bin/bash\n\
# Initialize database if needed\n\
if [ ! -f "/usr/src/app/.db_initialized" ]; then\n\
echo "Initializing database..."\n\
service postgresql start\n\
su - postgres -c "createuser -s root"\n\
su - postgres -c "createdb -O root escriptorium"\n\
python manage.py migrate\n\
python manage.py collectstatic --noinput\n\
touch /usr/src/app/.db_initialized\n\
fi\n\
\n\
# Start all services using supervisor\n\
exec supervisord -c /etc/supervisor/supervisord.conf\n\
' > /usr/src/app/start.sh && chmod +x /usr/src/app/start.sh
# Expose port 8080
EXPOSE 8080
# Define volumes for persistence
VOLUME ["/usr/src/app/static", "/usr/src/app/media", "/var/lib/postgresql/data"]
# Set the entrypoint
CMD ["/usr/src/app/start.sh"]