Docker Omeka Classic

I noticed a few people asking about Docker images for Omeka Classic on the forum and figured this might be useful. Below is a decent but imperfect starting point. It may have some cruft, but it works for me so I’m not worrying too much about refining it, nor about creating a portable image.

1. Set up

Install Docker Desktop and create a directory for your project, e.g. ~/Local Sites/omeka-classic-docker.

2. Create Dockerfile

Create Dockerfile (no file extension) with the following content. This version uses PHP 7.4 and Omeka 3.2, which you can change as needed.

FROM php:7.4-apache

# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y \
      unzip \
      imagemagick \
      libmagickwand-dev --no-install-recommends \
      libjpeg-dev \
      libpng-dev \
      libfreetype6-dev \
      libzip-dev \
    && docker-php-ext-install mysqli pdo pdo_mysql exif gd zip \
    && pecl install imagick \
    && docker-php-ext-enable imagick exif gd zip

# Enable Apache rewrite module
RUN a2enmod rewrite

# Set working directory
WORKDIR /var/www/html

# Download and extract Omeka Classic 3.2
ADD https://github.com/omeka/Omeka/releases/download/v3.2/omeka-3.2.zip /tmp/omeka.zip
RUN unzip /tmp/omeka.zip -d /tmp \
    && cp -a /tmp/omeka-3.2/. /var/www/html/ \
    && rm -rf /tmp/* \
    && chown -R www-data:www-data /var/www/html

# Force Apache to honor .htaccess
RUN echo '<Directory /var/www/html/>\n\
    Options Indexes FollowSymLinks\n\
    AllowOverride All\n\
    Require all granted\n\
</Directory>' > /etc/apache2/conf-enabled/allow-override.conf

EXPOSE 80

3. Create docker-compose.yml

Create docker-compose.yml with the following contents. This version uses MariaDB for compatibility with Apple Silicon and includes several mounted volumes to facilitate a typical theme/plugin development workflow (i.e. you can quickly access the files, themes, and plugins directories, as well as the .htaccess and db.ini files).

services:
  omeka:
    build: .
    container_name: omeka-classic
    ports:
      - "8080:80"
    volumes:
      - ./omeka_files:/var/www/html/files
      - ./omeka_plugins:/var/www/html/plugins
      - ./omeka_themes:/var/www/html/themes
      - ./db.ini:/var/www/html/db.ini
      - ./.htaccess:/var/www/html/.htaccess
    depends_on:
      - db
  db:
    image: mariadb:10.5
    container_name: omeka-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: omeka
      MYSQL_USER: omeka
      MYSQL_PASSWORD: omeka123
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

4. Create db.ini

Create a db.ini file with:

[database]
host     = "db"
username = "omeka"
password = "omeka123"
dbname   = "omeka"
prefix   = "omeka_"
charset  = "utf8"

; Omeka ImageMagick configuration
derivative_convert_path = "/usr/bin/"

5. Create .htaccess

Create/copy the default .htaccess file to your directory.

# Omeka .htaccess: Apache configuration file
# This file is required for Omeka to function correctly.

# --------------- #
# Error Reporting #
# --------------- #

# Uncomment the SetEnv line below to turn on detailed on-screen error
# reporting.
#
# Note: This should only be enabled for development or debugging. Keep this
# line commented for production sites.
# 
SetEnv APPLICATION_ENV development

# ------------- #
# Rewrite Rules #
# ------------- #

RewriteEngine on

# If you know mod_rewrite is enabled, but you are still getting mod_rewrite
# errors, uncomment the line below and replace "/" with your base directory.
#
# RewriteBase /

# Allow direct access to files (except PHP files)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !\.(php[0-9]?|phtml|phps)$ - [C]
RewriteRule .* - [L]

RewriteRule ^install/.*$ install/install.php [L]
RewriteRule ^admin/.*$ admin/index.php [L]
RewriteRule .* index.php

# -------------- #
# Access Control #
# -------------- #

# Block access to all .ini files.
<FilesMatch "\.ini$">
	<IfModule mod_authz_core.c>
		Require all denied
	</IfModule>
	<IfModule !mod_authz_core.c>
		Order Allow,Deny
		Deny from all
	</IfModule>
</FilesMatch>

# --------#
# Caching #
# --------#

# Uncomment the lines below in order to enable caching of some files
# (after a finished site has gone live)
#
# <IfModule mod_expires.c>
#        ExpiresActive on
#        ExpiresDefault "access plus 10 day"
#    </FilesMatch>
# </IfModule>

# ------------ #
# PHP Settings #
# ------------ #

<IfModule mod_php5.c>
	php_flag register_globals off
	php_flag magic_quotes_gpc off
</IfModule>

6. Run Docker

In your Terminal…

docker-compose up -d
open "http://localhost:8080/"

You might need to include the --build flag for the first run. Leave out the -d (detached) flag if you want to view live logs. Use docker-compose down (or sometimes Control + C depending on mode) to stop running. Your site should be accessible in your browser at http://localhost:8080/. Add themes and plugins as needed. To access other areas in your installation, use docker-compose exec omeka bash or add additional mounted volumes.