{"id":541360,"date":"2026-06-10T07:34:09","date_gmt":"2026-06-10T07:34:09","guid":{"rendered":"https:\/\/webkul.com\/blog\/?p=541360"},"modified":"2026-06-10T12:46:09","modified_gmt":"2026-06-10T12:46:09","slug":"setup-for-pimcore-development-environment","status":"publish","type":"post","link":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/","title":{"rendered":"Setup for PimCore Development Environment"},"content":{"rendered":"<p>Docker-based environment for a fresh Pimcore installation.<\/p>\n<h2>Directory Structure<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u251c\u2500\u2500 app\n\u251c\u2500\u2500 docker\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 data\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 certs\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 pimcore.local.crt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore.local.key\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 default.conf\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 php\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore-supervisor.conf\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 php.ini\n\u2514\u2500\u2500 docker-compose.yml\n<\/pre>\n<h2>Services<\/h2>\n<ul>\n<li><strong>php<\/strong> (<code>pimcore_php<\/code>) \u2014 Custom Dockerfile \u2014 PHP 8.4-FPM + Supervisord workers<\/li>\n<li><strong>nginx<\/strong> (<code>pimcore_nginx<\/code>) \u2014 <code>nginx:stable<\/code> \u2014 HTTPS reverse proxy<\/li>\n<li><strong>db<\/strong> (<code>pimcore_db<\/code>) \u2014 <code>mysql:8.0<\/code> \u2014 Application database<\/li>\n<li><strong>redis<\/strong> (<code>pimcore_redis<\/code>) \u2014 <code>redis:7-alpine<\/code> \u2014 Cache \/ session (2 GB LRU)<\/li>\n<li><strong>rabbitmq<\/strong> (<code>pimcore_rabbitmq<\/code>) \u2014 <code>rabbitmq:3-management<\/code> \u2014 Message broker<\/li>\n<li><strong>opensearch<\/strong> (<code>pimcore_opensearch<\/code>) \u2014 <code>opensearchproject\/opensearch:2.11.0<\/code> \u2014 Full-text search<\/li>\n<li><strong>mercure<\/strong> (<code>pimcore_mercure<\/code>) \u2014 <code>dunglas\/mercure<\/code> \u2014 Real-time SSE hub<\/li>\n<\/ul>\n<p>All containers share a bridge network named <code>pimcore<\/code>. Service hostnames (<code>db<\/code>, <code>redis<\/code>, etc.) resolve automatically within it.<\/p>\n<h2>Ports<\/h2>\n<ul>\n<li><strong>443<\/strong> \u2014 Nginx \u2014 Pimcore HTTPS<\/li>\n<li><strong>5672<\/strong> \u2014 RabbitMQ \u2014 AMQP<\/li>\n<li><strong>15672<\/strong> \u2014 RabbitMQ \u2014 Management UI (<code>guest<\/code> \/ <code>guest<\/code>)<\/li>\n<li><strong>9201<\/strong> \u2014 OpenSearch \u2014 REST API<\/li>\n<\/ul>\n<h2>Configuration Files<\/h2>\n<h3>docker-compose.yml<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">services:\n  php:\n    build:\n      context: .\/docker\n      dockerfile: php\/Dockerfile\n    container_name: pimcore_php\n    command: &gt;\n      bash -c \"\n      mkdir -p \/var\/www\/html\/var \/var\/www\/html\/public\/var &amp;&amp;\n      chown -R www-data:www-data \/var\/www\/html\/var \/var\/www\/html\/public\/var &amp;&amp;\n      chmod -R 775 \/var\/www\/html\/var \/var\/www\/html\/public\/var &amp;&amp;\n      \/usr\/bin\/supervisord -n -c \/etc\/supervisor\/supervisord.conf\n      \"\n    volumes:\n      - .\/app:\/var\/www\/html\n      - .\/docker\/php.ini:\/usr\/local\/etc\/php\/php.ini:ro\n      - .\/app\/.docker\/supervisord.conf:\/etc\/supervisor\/conf.d\/pimcore.conf:ro\n    depends_on:\n      - db\n      - redis\n      - opensearch\n    environment:\n      - APP_ENV=prod\n    networks:\n      - pimcore\n\n  nginx:\n    image: nginx:stable\n    container_name: pimcore_nginx\n    ports:\n      - \"443:443\"\n    volumes:\n      - .\/app:\/var\/www\/html\n      - .\/docker\/nginx\/default.conf:\/etc\/nginx\/conf.d\/default.conf\n      - .\/docker\/nginx\/certs:\/etc\/nginx\/certs:ro\n    depends_on:\n      - php\n    networks:\n      - pimcore\n\n  db:\n    image: mysql:8.0\n    container_name: pimcore_db\n    command: --default-authentication-plugin=mysql_native_password\n    environment:\n      MYSQL_ROOT_PASSWORD: root\n      MYSQL_DATABASE: pimcore\n      MYSQL_USER: pimcore\n      MYSQL_PASSWORD: pimcore\n    volumes:\n      - .\/docker\/data\/mysql:\/var\/lib\/mysql\n    networks:\n      - pimcore\n\n  redis:\n    image: redis:7-alpine\n    container_name: pimcore_redis\n    command: redis-server --maxmemory 2gb --maxmemory-policy allkeys-lru\n    volumes:\n      - .\/docker\/data\/redis:\/data\n    networks:\n      - pimcore\n\n  rabbitmq:\n    image: rabbitmq:3-management\n    container_name: pimcore_rabbitmq\n    ports:\n      - \"5672:5672\"\n      - \"15672:15672\"\n    environment:\n      RABBITMQ_DEFAULT_USER: guest\n      RABBITMQ_DEFAULT_PASS: guest\n    networks:\n      - pimcore\n\n  opensearch:\n    image: opensearchproject\/opensearch:2.11.0\n    container_name: pimcore_opensearch\n    environment:\n      discovery.type: single-node\n      plugins.security.disabled: \"true\"\n      OPENSEARCH_JAVA_OPTS: \"-Xms2g -Xmx2g\"\n    volumes:\n      - .\/docker\/data\/opensearch:\/usr\/share\/opensearch\/data\n    ports:\n      - \"9201:9200\"\n    networks:\n      - pimcore\n\n  mercure:\n    image: dunglas\/mercure:latest\n    container_name: pimcore_mercure\n    environment:\n      SERVER_NAME: \":80\"\n      MERCURE_PUBLISHER_JWT_KEY: \"YOUR_JWT_SECRET_KEY\"\n      MERCURE_SUBSCRIBER_JWT_KEY: \"YOUR_JWT_SECRET_KEY\"\n      MERCURE_EXTRA_DIRECTIVES: |\n        anonymous\n        cors_origins *\n    networks:\n      - pimcore\n\nnetworks:\n  pimcore:<\/pre>\n<p>Change <code>YOUR_JWT_SECRET_KEY<\/code> to a long random string \u2014 must match <code>MERCURE_JWT_KEY<\/code> in <code>app\/.env.local<\/code>.<\/p>\n<h3>docker\/php\/Dockerfile<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"dockerfile\">FROM php:8.4-fpm\n\n# System dependencies + supervisor (queue worker manager) + graphviz (Pimcore workflow diagrams)\n# libwebp-dev: WebP image support for GD (product images may be WebP)\nRUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \\\n    git unzip libicu-dev libzip-dev libpng-dev libjpeg-dev libfreetype6-dev \\\n    libwebp-dev \\\n    libonig-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev \\\n    libpq-dev libssl-dev librabbitmq-dev \\\n    graphviz \\\n    supervisor \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\n# PHP extensions \u2014 configure GD with JPEG + WebP + FreeType before installing\nRUN docker-php-ext-configure gd --with-jpeg --with-webp --with-freetype \\\n    &amp;&amp; docker-php-ext-install \\\n    pdo pdo_mysql intl zip gd opcache bcmath soap xsl exif\n\n# Redis extension\nRUN pecl install redis &amp;&amp; docker-php-ext-enable redis\n\n# AMQP extension\nRUN pecl install amqp &amp;&amp; docker-php-ext-enable amqp\n\n# Composer\nCOPY --from=composer:2 \/usr\/bin\/composer \/usr\/bin\/composer\n\n# Opcache config\nCOPY php.ini \/usr\/local\/etc\/php\/php.ini\n\n# Supervisord config \u2014 manages php-fpm + all Pimcore queue workers\nCOPY php\/pimcore-supervisor.conf \/etc\/supervisor\/conf.d\/pimcore.conf\n\nWORKDIR \/var\/www\/html\n\n# Wrapper: always run bin\/console as www-data so var\/ files get correct ownership\nRUN printf '#!\/bin\/sh\\nexec su -s \/bin\/sh www-data -c \"php \/var\/www\/html\/bin\/console $*\"\\n' \\\n    &gt; \/usr\/local\/bin\/pimcore &amp;&amp; chmod +x \/usr\/local\/bin\/pimcore\n\n# supervisord runs in foreground and manages php-fpm + workers\nCMD [\"\/usr\/bin\/supervisord\", \"-n\", \"-c\", \"\/etc\/supervisor\/supervisord.conf\"]\n<\/pre>\n<h3>docker\/php.ini<\/h3>\n<pre><code class=\"language-ini\"><\/code><\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">memory_limit=2G\nmax_execution_time=300\nupload_max_filesize=512M\npost_max_size=600M\n\nopcache.enable=1\nopcache.memory_consumption=512\nopcache.max_accelerated_files=20000\nopcache.validate_timestamps=0\n\nrealpath_cache_size=4096k\nrealpath_cache_ttl=600\n<\/pre>\n<pre><code class=\"language-ini\"><\/code><\/pre>\n<pre>Set <code>opcache.validate_timestamps=1<\/code> in development so code changes apply without a container restart.<\/pre>\n<h3>docker\/php\/pimcore-supervisor.conf<\/h3>\n<pre><code class=\"language-ini\"><\/code><\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\"># Supervisord program definitions for Pimcore PHP container\n# supervisord is started as the container entrypoint; it manages php-fpm and all queue workers.\n\n[program:php-fpm]\ncommand=\/usr\/local\/sbin\/php-fpm --nodaemonize\nautostart=true\nautorestart=true\npriority=1\nstdout_logfile=\/dev\/fd\/1\nstdout_logfile_maxbytes=0\nredirect_stderr=true\n\n[program:messenger-consume]\ncommand=php \/var\/www\/html\/bin\/console messenger:consume pimcore_generic_data_index_queue scheduler_generic_data_index pimcore_core pimcore_maintenance pimcore_scheduled_tasks pimcore_image_optimize --memory-limit=250M --time-limit=3600\nnumprocs=1\nstartsecs=0\nautostart=true\nautorestart=true\nuser=www-data\npriority=10\nprocess_name=%(program_name)s_%(process_num)02d\nstdout_logfile=\/dev\/fd\/1\nstdout_logfile_maxbytes=0\nredirect_stderr=true\n\n[program:consume-asset-update]\ncommand=php \/var\/www\/html\/bin\/console messenger:consume pimcore_asset_update --memory-limit=250M --time-limit=3600\nnumprocs=1\nstartsecs=0\nautostart=true\nautorestart=true\nuser=www-data\npriority=10\nprocess_name=%(program_name)s_%(process_num)02d\nstdout_logfile=\/dev\/fd\/1\nstdout_logfile_maxbytes=0\nredirect_stderr=true\n\n[program:consume-execution-engine]\ncommand=php \/var\/www\/html\/bin\/console messenger:consume pimcore_generic_execution_engine --memory-limit=250M --time-limit=3600\nnumprocs=1\nstartsecs=0\nautostart=true\nautorestart=true\nuser=www-data\npriority=10\nprocess_name=%(program_name)s_%(process_num)02d\nstdout_logfile=\/dev\/fd\/1\nstdout_logfile_maxbytes=0\nredirect_stderr=true\n\n[program:maintenance]\ncommand=bash -c 'sleep 3600 &amp;&amp; exec php \/var\/www\/html\/bin\/console pimcore:maintenance'\nautostart=true\nautorestart=true\nuser=www-data\npriority=10\nstdout_logfile=\/dev\/fd\/1\nstdout_logfile_maxbytes=0\nredirect_stderr=true\n<\/pre>\n<pre><code class=\"language-ini\"><\/code><\/pre>\n<pre><code class=\"language-ini\"><\/code><\/pre>\n<h3>docker\/nginx\/default.conf<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">server {\n    listen 80;\n    server_name pimcore.local;\n\n    return 301 https:\/\/$host$request_uri;\n}\n\nserver {\n    listen 443 ssl;\n    server_name pimcore.local;\n\n    ssl_certificate \/etc\/nginx\/certs\/pimcore.local.crt;\n    ssl_certificate_key \/etc\/nginx\/certs\/pimcore.local.key;\n\n    root \/var\/www\/html\/public;\n    index index.php;\n\n    gzip on;\n    gzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml text\/javascript;\n    gzip_min_length 1000;\n    gzip_comp_level 4;\n    gzip_vary on;\n    gzip_proxied any;\n\n    # Mercure SSE hub proxy \u2014 handles both \/hub (browser SSE) and \/hub\/.well-known\/mercure (PHP publisher)\n    location \/hub {\n        rewrite ^\/hub(.*)$ \/.well-known\/mercure break;\n        proxy_pass http:\/\/mercure;\n        proxy_read_timeout 24h;\n        proxy_http_version 1.1;\n        proxy_set_header Host $host;\n        proxy_set_header Connection \"\";\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_buffering off;\n        proxy_cache off;\n        chunked_transfer_encoding on;\n    }\n\n    location = \/admin {\n        return 302 \/pimcore-studio\/login;\n    }\n\n    location = \/admin\/ {\n        return 302 \/pimcore-studio\/login;\n    }\n\n    # Pimcore thumbnail routing: \/6\/image-thumb__6__name\/file.jpg\n    # Studio generates URLs without the \/var\/tmp\/thumbnails\/ prefix.\n    # Remap the path to the real location; fall back to PHP to generate missing thumbnails.\n    location ~ \"^\/[0-9]+\/image-thumb__[0-9]+__\" {\n        try_files \/var\/tmp\/thumbnails$uri \/index.php$is_args$args;\n        expires max;\n        log_not_found off;\n    }\n\n    location \/ {\n        try_files $uri \/index.php$is_args$args;\n    }\n\n    location ~* ^\/catalog-import\/ {\n        client_max_body_size 600m;\n        try_files $uri \/index.php$is_args$args;\n    }\n\n    location ~ ^\/index\\.php(\/|$) {\n        client_max_body_size 600m;\n        fastcgi_pass php:9000;\n        fastcgi_split_path_info ^(.+\\.php)(\/.*)$;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        fastcgi_param HTTPS on;\n        fastcgi_buffers 16 16k;\n        fastcgi_buffer_size 32k;\n        fastcgi_read_timeout 300;\n    }\n\n    # Block direct access to PHP files (security best practice)\n    location ~ \\.php$ {\n        return 404;\n    }\n\n    location \/pimcore-studio\/public\/review\/ {\n        alias \/var\/www\/html\/public\/review\/;\n        autoindex on;\n        try_files $uri $uri\/ =404;\n    }\n\n    location ~* \\.(jpg|jpeg|png|gif|webp|svg|css|js|ico|xml)$ {\n        try_files $uri \/index.php$is_args$args;\n        expires max;\n        log_not_found off;\n    }\n}\n<\/pre>\n<h3>app\/.env<\/h3>\n<p>Committed with safe placeholder values:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">APP_ENV=dev\nAPP_DEBUG=true\n\nAPPLICATION_SECRET=CHANGE_ME_APPLICATION_SECRET_KEY_LONG_ENOUGH_FOR_VALIDATION\n\nDATABASE_URL=mysql:\/\/pimcore:pimcore@db:3306\/pimcore\n\nPIMCORE_ADMIN_USER=admin\nPIMCORE_ADMIN_PASSWORD=admin\n\nPIMCORE_OPENSEARCH_DSN=opensearch:\/\/opensearch:9200\n\nPIMCORE_MESSENGER_TRANSPORT_DSN_PREFIX=amqp:\/\/guest:guest@rabbitmq:5672\/%2f\/\nRABBITMQ_DSN=amqp:\/\/guest:guest@rabbitmq:5672\/%2f\n\nMERCURE_JWT_KEY=CHANGE_ME_THIS_IS_MY_SECRET_KEY_THAT_IS_LONG_ENOUGH_FOR_VALIDATION\nMERCURE_URL=http:\/\/localhost\/hub\nMERCURE_SERVER_URL=http:\/\/mercure\/.well-known\/mercure<\/pre>\n<h3>app\/.env.local<\/h3>\n<p>Created on the server only \u2014 never committed:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">APP_ENV=prod\nAPP_DEBUG=false\n\n# Generate with: openssl rand -hex 32\nAPPLICATION_SECRET=&lt;your-random-secret&gt;\n\nPIMCORE_BASE_URL=https:\/\/YOUR_DOMAIN_OR_IP\n\n# Must match MERCURE_PUBLISHER_JWT_KEY in docker-compose.yml\nMERCURE_JWT_KEY=&lt;same-key-as-docker-compose&gt;<\/pre>\n<h2>Fresh Instance Setup<\/h2>\n<h3>1. Clone the repository<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">git clone &lt;repo-url&gt; pimcore-docker \ncd pimcore-docker<\/pre>\n<h3>2. Create app\/.env.local<\/h3>\n<p>Copy the template above and fill in real values.<\/p>\n<h3>3. Generate SSL certificates<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">mkdir -p docker\/nginx\/certs\n\nopenssl req \\\n  -x509 \\\n  -nodes \\\n  -days 3650 \\\n  -newkey rsa:2048 \\\n  -keyout docker\/nginx\/certs\/pimcore.local.key \\\n  -out docker\/nginx\/certs\/pimcore.local.crt \\\n  -subj \"\/CN=pimcore.local\"<\/pre>\n<p>For a real domain, place your CA-signed <code>.crt<\/code> and <code>.key<\/code> in <code>docker\/nginx\/certs\/<\/code> and update <code>default.conf<\/code>.<\/p>\n<h3>4. Build and start containers<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">docker compose up -d --build<\/pre>\n<p>Wait ~30 seconds, then verify all services show <code>Up<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker compose ps<\/pre>\n<h3>5. Install Composer dependencies<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker exec pimcore_php composer install --no-dev --optimize-autoloader --no-interaction -d \/var\/www\/html<\/pre>\n<h3>6. Install Pimcore (first run only)<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">docker exec pimcore_php pimcore pimcore:install --admin-username=admin --admin-password=admin --mysql-host-socket=db --mysql-database=pimcore --mysql-username=pimcore --mysql-password=pimcore --no-interaction<\/pre>\n<p>On subsequent deploys, run migrations instead:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">docker exec pimcore_php pimcore doctrine:migrations:migrate --no-interaction<\/pre>\n<h3>7. Install assets, warm cache, build index<\/h3>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker exec -u www-data pimcore_php php \/var\/www\/html\/bin\/console assets:install --symlink\ndocker exec -u www-data pimcore_php php \/var\/www\/html\/bin\/console cache:warmup --env=prod\ndocker exec -u www-data pimcore_php php \/var\/www\/html\/bin\/console generic-data-index:update-index-settings --all<\/pre>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h3><code class=\"language-bash\"><br \/>\n<\/code>8. Verify<\/h3>\n<ul>\n<li><code>https:\/\/YOUR_SERVER_IP\/pimcore-studio\/login<\/code> \u2014 Pimcore admin login<\/li>\n<li><code>http:\/\/YOUR_SERVER_IP:15672<\/code> \u2014 RabbitMQ UI (<code>guest<\/code> \/ <code>guest<\/code>)<\/li>\n<li><code>http:\/\/YOUR_SERVER_IP:9201<\/code> \u2014 OpenSearch REST API<\/li>\n<\/ul>\n<h2>Common Commands<\/h2>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># View logs\ndocker compose logs -f\n\n# View PHP container logs\ndocker compose logs -f php\n\n# Run Pimcore console commands\ndocker exec pimcore_php pimcore &lt;command&gt;\n\n# Shell access to PHP container\ndocker exec -it pimcore_php bash\n\n# Clear cache\ndocker exec -u www-data pimcore_php php \/var\/www\/html\/bin\/console cache:clear\n\n# Restart PHP container\/workers after a code change\ndocker compose restart php\n\n# Reload Nginx without downtime\ndocker exec pimcore_nginx nginx -s reload\n\n# Rebuild PHP image after Dockerfile changes\ndocker compose up -d --build php\n\n# Stop all containers\ndocker compose down\n\n# Wipe all persistent data (DESTRUCTIVE)\ndocker compose down\nrm -rf docker\/data\/mysql\nrm -rf docker\/data\/opensearch\nrm -rf docker\/data\/redis<\/pre>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h2>Troubleshooting<\/h2>\n<p><strong>Containers won&#8217;t start<\/strong> \u2014 check logs:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker compose up --build \ndocker compose logs php<\/pre>\n<p><strong>502 Bad Gateway<\/strong> \u2014 PHP may still be initialising. Check supervisor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker exec pimcore_php supervisorctl status<\/pre>\n<p>All programs should show <code>RUNNING<\/code>. If <code>php-fpm<\/code> shows <code>FATAL<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker exec pimcore_php supervisorctl tail php-fpm<\/pre>\n<p><strong>Database refused<\/strong> \u2014 MySQL takes 20\u201330 s on first boot. Watch until &#8220;ready for connections&#8221;:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker compose logs -f db<\/pre>\n<p><strong>Permission errors on var\/<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">docker exec pimcore_php bash -c \"chown -R www-data:www-data \/var\/www\/html\/var \/var\/www\/html\/public\/var &amp;&amp; chmod -R 775 \/var\/www\/html\/var \/var\/www\/html\/public\/var\"<\/pre>\n<p><strong>OpenSearch index empty after import<\/strong> \u2014 check workers and queue:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker exec pimcore_php supervisorctl status messenger-consume:* \ndocker exec pimcore_php pimcore messenger:stats<\/pre>\n<hr \/>\n<p>The <code>.\/app<\/code> directory is bind-mounted \u2014 PHP file edits take effect immediately. Dockerfile or supervisor config changes require <code>docker compose up -d --build php<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker-based environment for a fresh Pimcore installation. Directory Structure \u251c\u2500\u2500 app \u251c\u2500\u2500 docker \u2502\u00a0\u00a0 \u251c\u2500\u2500 data \u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 certs \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 pimcore.local.crt \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore.local.key \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 default.conf \u2502\u00a0\u00a0 \u251c\u2500\u2500 php \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore-supervisor.conf \u2502\u00a0\u00a0 \u2514\u2500\u2500 php.ini \u2514\u2500\u2500 docker-compose.yml Services php <a href=\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":766,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-541360","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Setup for PimCore Development Environment - Webkul Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Setup for PimCore Development Environment - Webkul Blog\" \/>\n<meta property=\"og:description\" content=\"Docker-based environment for a fresh Pimcore installation. Directory Structure \u251c\u2500\u2500 app \u251c\u2500\u2500 docker \u2502\u00a0\u00a0 \u251c\u2500\u2500 data \u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 certs \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 pimcore.local.crt \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore.local.key \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 default.conf \u2502\u00a0\u00a0 \u251c\u2500\u2500 php \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore-supervisor.conf \u2502\u00a0\u00a0 \u2514\u2500\u2500 php.ini \u2514\u2500\u2500 docker-compose.yml Services php [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\" \/>\n<meta property=\"og:site_name\" content=\"Webkul Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webkul\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-10T07:34:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-10T12:46:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-og.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"sandeep.akeneo322\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webkul\" \/>\n<meta name=\"twitter:site\" content=\"@webkul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"sandeep.akeneo322\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\"},\"author\":{\"name\":\"sandeep.akeneo322\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/031dfdd28254a4cd2665acd7016b0706\"},\"headline\":\"Setup for PimCore Development Environment\",\"datePublished\":\"2026-06-10T07:34:09+00:00\",\"dateModified\":\"2026-06-10T12:46:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\"},\"wordCount\":252,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\",\"url\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\",\"name\":\"Setup for PimCore Development Environment - Webkul Blog\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/#website\"},\"datePublished\":\"2026-06-10T07:34:09+00:00\",\"dateModified\":\"2026-06-10T12:46:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webkul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Setup for PimCore Development Environment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webkul.com\/blog\/#website\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"name\":\"Webkul Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webkul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webkul.com\/blog\/#organization\",\"name\":\"WebKul Software Private Limited\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"width\":380,\"height\":380,\"caption\":\"WebKul Software Private Limited\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webkul\/\",\"https:\/\/x.com\/webkul\",\"https:\/\/www.instagram.com\/webkul\/\",\"https:\/\/www.linkedin.com\/company\/webkul\",\"https:\/\/www.youtube.com\/user\/webkul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/031dfdd28254a4cd2665acd7016b0706\",\"name\":\"sandeep.akeneo322\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0f777b24e6e15b871e5b8932f8210c0695d115caa24d25d73137c85e3464fffb?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0f777b24e6e15b871e5b8932f8210c0695d115caa24d25d73137c85e3464fffb?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"caption\":\"sandeep.akeneo322\"},\"url\":\"https:\/\/webkul.com\/blog\/author\/sandeep-akeneo322\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Setup for PimCore Development Environment - Webkul Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/","og_locale":"en_US","og_type":"article","og_title":"Setup for PimCore Development Environment - Webkul Blog","og_description":"Docker-based environment for a fresh Pimcore installation. Directory Structure \u251c\u2500\u2500 app \u251c\u2500\u2500 docker \u2502\u00a0\u00a0 \u251c\u2500\u2500 data \u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 certs \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 pimcore.local.crt \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore.local.key \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 default.conf \u2502\u00a0\u00a0 \u251c\u2500\u2500 php \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 Dockerfile \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pimcore-supervisor.conf \u2502\u00a0\u00a0 \u2514\u2500\u2500 php.ini \u2514\u2500\u2500 docker-compose.yml Services php [...]","og_url":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/","og_site_name":"Webkul Blog","article_publisher":"https:\/\/www.facebook.com\/webkul\/","article_published_time":"2026-06-10T07:34:09+00:00","article_modified_time":"2026-06-10T12:46:09+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-og.png","type":"image\/png"}],"author":"sandeep.akeneo322","twitter_card":"summary_large_image","twitter_creator":"@webkul","twitter_site":"@webkul","twitter_misc":{"Written by":"sandeep.akeneo322","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#article","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/"},"author":{"name":"sandeep.akeneo322","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/031dfdd28254a4cd2665acd7016b0706"},"headline":"Setup for PimCore Development Environment","datePublished":"2026-06-10T07:34:09+00:00","dateModified":"2026-06-10T12:46:09+00:00","mainEntityOfPage":{"@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/"},"wordCount":252,"commentCount":0,"publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/","url":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/","name":"Setup for PimCore Development Environment - Webkul Blog","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/#website"},"datePublished":"2026-06-10T07:34:09+00:00","dateModified":"2026-06-10T12:46:09+00:00","breadcrumb":{"@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/webkul.com\/blog\/setup-for-pimcore-development-environment\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webkul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Setup for PimCore Development Environment"}]},{"@type":"WebSite","@id":"https:\/\/webkul.com\/blog\/#website","url":"https:\/\/webkul.com\/blog\/","name":"Webkul Blog","description":"","publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webkul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webkul.com\/blog\/#organization","name":"WebKul Software Private Limited","url":"https:\/\/webkul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","width":380,"height":380,"caption":"WebKul Software Private Limited"},"image":{"@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webkul\/","https:\/\/x.com\/webkul","https:\/\/www.instagram.com\/webkul\/","https:\/\/www.linkedin.com\/company\/webkul","https:\/\/www.youtube.com\/user\/webkul\/"]},{"@type":"Person","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/031dfdd28254a4cd2665acd7016b0706","name":"sandeep.akeneo322","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0f777b24e6e15b871e5b8932f8210c0695d115caa24d25d73137c85e3464fffb?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0f777b24e6e15b871e5b8932f8210c0695d115caa24d25d73137c85e3464fffb?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","caption":"sandeep.akeneo322"},"url":"https:\/\/webkul.com\/blog\/author\/sandeep-akeneo322\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/541360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/users\/766"}],"replies":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/comments?post=541360"}],"version-history":[{"count":11,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/541360\/revisions"}],"predecessor-version":[{"id":542521,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/541360\/revisions\/542521"}],"wp:attachment":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media?parent=541360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/categories?post=541360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/tags?post=541360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}