I've been struggling to find a good working Docker container to start working on Magento 2 under Windows 10.
I created my own based on this tutorial:https://tech.osteel.me/posts/docker-for-local-web-development-part-1-a-basic-lemp-stack#nginx
This is not for using it on production environment or anything, just for playing around with Magento 2.
I'm having an issue with Nginx throwing 404 for /src/pub/static files. Maybe something is wrong with my Nginx config?
Magento 2 version 2.3.5-p1
Access logs show this:
[error] 6#6: *11 open() "/var/www/php/pub/static/version1592198150/frontend/Magento/luma/en_CA/Magento_Theme/favicon.ico" failed (2: No such file or directory), client: 172.20.0.1, server: magento.test
Here is my folder structure:
/
/.docker
/.docker/mysql
/.docker/mysql/my.cnf
/.docker/nginx/conf.d/php.conf
/.docker/nginx/conf.d/phpmyadmin.conf
/.docker/php/Dockerfile
/src
/.env
/docker-compose.yml
/php.env
Here are my files:
docker-compose.yml
version: "3.7"
# Services
services:
# Nginx Service
nginx:
image: nginx:1.17
container_name: nginx
#restart: always
ports:
- 80:80
volumes:
- ./src:/var/www/php:ro
- ./.docker/nginx/conf.d:/etc/nginx/conf.d:ro
- phpmyadmindata:/usr/src/phpmyadmin
depends_on:
- php
- phpmyadmin
networks:
- app-network
# PHP Service
php:
build: ./.docker/php
container_name: php
#restart: always
working_dir: /var/www/php
environment:
- COMPOSER_MEMORY_LIMIT=-1
volumes:
- ./src:/var/www/php
links:
- mysql
- redis
depends_on:
- mysql
networks:
- app-network
# MySQL Service
mysql:
image: mariadb:10
container_name: mysql
#restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: magento
volumes:
- ./.docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
- mysqldata:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app-network
# PhpMyAdmin Service
phpmyadmin:
image: phpmyadmin/phpmyadmin:5-fpm
container_name: phpmyadmin
#restart: always
environment:
PMA_HOST: mysql
volumes:
- phpmyadmindata:/usr/src/phpmyadmin
links:
- mysql:db
depends_on:
- mysql
networks:
- app-network
redis:
image: redis:latest
#restart: always
container_name: redis
restart: always
volumes:
- redis-data:/data
networks:
- app-network
# Volumes
volumes:
mysqldata:
phpmyadmindata:
redis-data:
external: false
#Docker Networks
networks:
app-network:
driver: bridge
php.conf
error_log /var/log/nginx/error.log debug;
upstream fastcgi_backend {
server 127.0.0.1:9000;
}
server {
listen 80;
listen [::]:80;
server_name magento.test;
set $MAGE_ROOT /var/www/php;
root $MAGE_ROOT;
index index.php index.html index.htm;
autoindex off;
charset UTF-8;
error_page 404 403 = /errors/404.php;
#add_header "X-UA-Compatible" "IE=Edge";
add_header 'X-Content-Type-Options' 'nosniff';
# Deny access to sensitive files
location /.user.ini {
deny all;
}
# PHP entry point for setup application
location ~* ^/setup($|/) {
root /var/www/php;
location ~ ^/setup/index.php {
fastcgi_pass php:9000;
fastcgi_param PHP_FLAG "session.auto_start=off \n suhosin.session.cryptua=off";
fastcgi_param PHP_VALUE "memory_limit=4000M \n max_execution_time=600";
fastcgi_read_timeout 600s;
fastcgi_connect_timeout 600s;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ ^/setup/(?!pub/). {
deny all;
}
location ~ ^/setup/pub/ {
add_header X-Frame-Options "SAMEORIGIN";
}
}
# PHP entry point for update application
location ~* ^/update($|/) {
root /var/www/php;
location ~ ^/update/index.php {
fastcgi_split_path_info ^(/update/index.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
# Deny everything but index.php
location ~ ^/update/(?!pub/). {
deny all;
}
location ~ ^/update/pub/ {
add_header X-Frame-Options "SAMEORIGIN";
}
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location /pub/ {
location ~ ^/pub/media/(downloadable|customer|import|custom_options|theme_customization/.*\.xml) {
deny all;
}
alias /var/www/php/pub/;
add_header X-Frame-Options "SAMEORIGIN";
}
location /static/ {
# Uncomment the following line in production mode
# expires max;
# Remove signature of the static files that is used to overcome the browser cache
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|html|json)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
add_header X-Frame-Options "SAMEORIGIN";
expires off;
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
}
if (!-f $request_filename) {
rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last;
}
add_header X-Frame-Options "SAMEORIGIN";
}
location /media/ {
try_files $uri $uri/ /get.php$is_args$args;
location ~ ^/media/theme_customization/.*\.xml {
deny all;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
add_header Cache-Control "public";
add_header X-Frame-Options "SAMEORIGIN";
expires +1y;
try_files $uri $uri/ /get.php$is_args$args;
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
add_header X-Frame-Options "SAMEORIGIN";
expires off;
try_files $uri $uri/ /get.php$is_args$args;
}
add_header X-Frame-Options "SAMEORIGIN";
}
location /media/customer/ {
deny all;
}
location /media/downloadable/ {
deny all;
}
location /media/import/ {
deny all;
}
location /media/custom_options/ {
deny all;
}
location /errors/ {
location ~* \.xml$ {
deny all;
}
}
# PHP entry point for main application
location ~ ^/(index|get|static|errors/report|errors/404|errors/503|health_check)\.php$ {
try_files $uri =404;
fastcgi_pass php:9000;
fastcgi_buffers 1024 4k;
fastcgi_param PHP_FLAG "session.auto_start=off \n suhosin.session.cryptua=off";
fastcgi_param PHP_VALUE "memory_limit=4000M \n max_execution_time=18000";
fastcgi_read_timeout 600s;
fastcgi_connect_timeout 600s;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_min_length 1100;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types
text/plain
text/css
text/js
text/xml
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/xml+rss
image/svg+xml;
gzip_vary on;
# Banned locations (only reached if the earlier PHP entry point regexes don't match)
location ~* (\.php$|\.phtml$|\.htaccess$|\.git) {
deny all;
}
}
php.env
PHP_MEMORY_LIMIT=4000M
PHP_ENABLE_XDEBUG=false
UPDATE_UID_GID=true
DEBUG=false
ENABLE_SENDMAIL=true
UPLOAD_MAX_FILESIZE=64M
PHP_DISPLAY_ERRORS=1
PHP_MAX_EXECUTION_TIME=300
PHP_POST_MAX_SIZE=500M
PHP_UPLOAD_MAX_FILESIZE=1024M
Dockerfile
FROM php:7.2-fpm
# Install dependencies
RUN apt-get update \
&& apt-get install -y \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
git \
libpng-dev \
libxslt1-dev \
#sendmail-bin \
# sendmail \
sudo
# Configure the gd library
RUN docker-php-ext-configure \
gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
# Install required PHP extensions
RUN docker-php-ext-install \
dom \
gd \
intl \
mbstring \
pdo_mysql \
xsl \
zip \
soap \
bcmath \
pcntl \
sockets
# Install Xdebug (but don't enable)
RUN pecl install -o -f xdebug
ENV PHP_MEMORY_LIMIT 6G
ENV PHP_ENABLE_XDEBUG false
ENV COMPOSER_MEMORY_LIMIT=-1
#ENV MAGENTO_ROOT /var/www/magento
ENV DEBUG false
ENV UPDATE_UID_GID false
# Install Composer
#RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
phpmyadmin.conf
server {
listen 80;
listen [::]:80;
server_name phpmyadmin.test;
root /usr/src/phpmyadmin;
index index.php;
location ~* \.php$ {
fastcgi_pass phpmyadmin:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
When you launch the containers and access http://magento.test setup guide shows up with no issues, goes through all the steps and installs Magento 2.
Once you land on the page, it shows 404 for all the assets in /pub/static.
I have refreshed cache, I have deleted and regenerated static assets, nothing helped.
I assume this is some kind of misconfig of Nginx or file permission issue?