So, to put in context, I’ve been trying to restore a backup that I made of my prestashop that was hosted in a VM, both the prestashop and mariadb were on the same system.
The db is hosted in another container that contains it’s proper backup when was hosted in the VM
Here is the prestashop Image I’ve been doing (Ipaddres=172.17.0.3, upated):
FROM prestashop/prestashop:1.7
#Expose port 443 to be accessed
EXPOSE 443/tcp
#copy the backup file that you want to restore into the Docker image and the config
RUN mkdir /root/backup/
COPY my_backup.zip /root/backup/
#sets de DB passwd to debian (default uses root user)
#To be determined IP address, for the moment i'll put the ip address of my db running container
#I don't know for a fact but i think these env are not beeing used
ENV DB_SERVER=172.17.0.2
ENV DB_PASSWD=debian
#sets de db name, default prestashop, I'm using this one
ENV DB_NAME=prestashop_asix
#auto installs image with ssl enabled
ENV PS_ENABLE_SSL=1
ENV PS_INSTALL_AUTO=1
#script that restores the backup
RUN set -eux && \
apt-get update && \
apt-get install -y unzip openssl wget systemctl nano && \
rm -rf /var/www/html/* && \
unzip /root/backup/my_backup.zip -d /var/www/html && \
rm -rf /root/backup/my_backup.zip && \
chmod -R 755 /var/www/html/presta_backup
#This script installs the unzip utility, unzips the backup file,
#and moves the contents of the backup to the /var/www/html directory,
#which is the default web root for PrestaShop.
#generates the certificate and key necessary for the https site
#modify -subj values to your liking
RUN openssl req \
-x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/key.pem \
-out /etc/ssl/certs/cert.crt -sha256 -days 365 \
-subj '/C=US/ST=Oregon/L=Portland/CN=www.madboa.com'
#copies the site to the config
RUN rm -rf /etc/apache2/sites-available/
COPY https.conf /etc/apache2/sites-available/
RUN echo "ServerName 172.17.0.3" >> /etc/apache2/apache2.conf && \
echo "<Directory /var/www/html/presta_backup>\n\tOptions Indexes FollowSymLinks\n\tAllowOverride None\n\tRequire all granted\n</Directory>" >> /etc/apache2/apache2.conf
RUN chown www-data:www-data -R /var/www/html/presta_backup/
RUN a2enmod ssl
RUN a2ensite https.conf
RUN apache2ctl configtest
RUN systemctl start apache2
#TO implment
#I changed /etc/apache2/apache2.conf -> <Directory /var/www/html/presta_backup>
#maybe is something wrong with .htaccess?
the mariadb image (it restores a logical backup - ipaddress= 172.17.0.2):
FROM mariadb:10.5.18
COPY my_backup.sql /docker-entrypoint-initdb.d/
ENV MARIADB_ROOT_PASSWORD=debian
I’ve tried using --link when runing the prestashop image in a container but does not seem to work, I still get the same erro checking docker logs (Checking if 172.17.0.2 is available… \n Waiting for confirmation of MySQL service startup)
the .htaccess file:
# ~~start~~ Do not remove this comment, Prestashop will keep automatically the code outside this comment when .htaccess will be generated again
# .htaccess automaticaly generated by PrestaShop e-commerce open-source solution
# https://www.prestashop.com - https://www.prestashop.com/forums
<IfModule mod_rewrite.c>
<IfModule mod_env.c>
SetEnv HTTP_MOD_REWRITE On
</IfModule>
RewriteEngine on
#Domain: 172.22.9.225
RewriteRule . - [E=REWRITEBASE:/]
RewriteRule ^api(?:/(.*))?$ %{ENV:REWRITEBASE}webservice/dispatcher.php?url=$1 [QSA,L]
# AlphaImageLoader for IE and fancybox
RewriteRule ^images_ie/?([^/]+)\.(jpe?g|png|gif)$ js/jquery/plugins/fancybox/images/$1.$2 [L]
</IfModule>
AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType application/font-woff .woff
AddType font/woff2 .woff2
<IfModule mod_headers.c>
<FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|svg)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
<FilesMatch "\.pdf$">
Header set Content-Disposition "Attachment"
Header set X-Content-Type-Options "nosniff"
</FilesMatch>
</IfModule>
<Files composer.lock>
# Apache 2.2
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</Files>
#If rewrite mod isn't enabled
ErrorDocument 404 /index.php?controller=404
# ~~end~~ Do not remove this comment, Prestashop will keep automatically the code outside this comment when .htaccess will be generated again
```
One thing that immediately hits the eye is that your Dockerfiles have environment specific configuration. Instead of hard coding environment specific configuration in the image, you want to create an entrypoint script that leverage ENV variables you configured for the container to update configuration files.
If you communicate to other containers by ip addresses, then you are high likely trying to do something that is not really meant to be done like this.
I assume you configure your containers using a docker compose file. If you don’t, I strongly recommend beginning using them, as they can be stored in the same git repo and make the container configuration reproducible.
If you share your docker run commands that you use to create your containers, we can help you to turn them into a compose file.
Have you checked if the prestashop container already provides extensibility by design? Most images allow to map volumes or host folders into container folders and use environment variables to customize the application inside the container.
sudo docker run -itd --name mariadb mariadb:backup
(where mariadb:backup is the image I’ve generated)
And yeah, I’ve checked if the container provided extensibility, I’m currently using prestashop/prestashop:1.7 which does not feature that, I also tried using bitnami/prestashop but was not able to restore the backup, I think the problem resides on the backup itself, i can send the files that I’ve modified if needed.
Perhaps It could also be some bug regarding prestashop installation since I’m enabling auto install?
The compose file for the v2 version of docker compose would look something like this:
Copy the content into a file called compose.yml or docker-compose.yml. Modify to your needs, for instance I used placeholder for host paths of the volume mapping, yours will most likely look different.
services:
prestashop:
container_name: prestashopv1
image: presta:backup1
restart: unless-stopped
networks:
default: {}
ports:
- 4443:443
environment:
DB_SERVER: db
DB_USER: root
DB_PASSWD: debian
DB_NAME: prestashop_asix
ENV PS_ENABLE_SSL: 1
ENV PS_INSTALL_AUTO: 1
volumes:
- ./backup:/root/backup/
# probably more binds or volumes ./prestahop:-
db:
image: mariadb:10.5.18
restart: unless-stopped
networks:
default: {}
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: debian
volumes:
# this is a docker named volume (manged by docker, mounted into a container folder)
- mariadb-data:/var/lib/mysql
# this is a bind (=host folder bind-mount into a containerf)
- ./my_backup.sql:/docker-entrypoint-initdb.d/my_backup.sql
networks:
default:
name: prestashop-net
volumes:
mariadb-data: {}
Then run docker compose up to see if the containers start as expected. if they do, you can press ctrl+c and then start the deployment detached: docker compose up -d. If you do changes on the compose file, just use the last command again and a new container will be deployed with the changes.
With docker compose, the containers would be attached to a user defined network and therefor can use the dns-based service discovery. The default bridge network does not support service discovery and required links because of that - links are deprecated.
Of course this snippet from above is just to give you an idea. Since your docker run commands didn’t really provide much parameters, there was not much to work with.
The idea is to get you started. If you encounter problem, try to solve them on your own (see document links below), if you can’t paste what you did and the error message and we can see.
You can find the docs for the compose specification here:
You can find the docker compose documentation here:
With the help of a friend I finally managed to do it, I’ll put it here in case somebody ever comes across this same issue: Please note that this only works on my environment, and comments are in Spanish
#Importa la última versión de la imagen de debian disponible en docker-hub
FROM debian:latest
#crea un directorio donde va a copiar el backup
RUN mkdir /root/backup/
COPY hola.tgz /root/backup/
#actualiza, instala dependencias, borra contenidos predeterminados en /html, descomprime el backup en /www, borra el backup comprimido
#cambia parámetreos de archivos de config necesarios
#borra /cache/prod puesto que no es necesario y se autoregenera
RUN set -eux && \
apt-get update && \
apt-get install php libapache2-mod-php7.4 php7.4-curl php7.4-xml php7.4-gd php7.4-intl php7.4-mbstring php7.4-zip php7.4-mysql unzip openssl wget systemctl nano sed tar -y && \
rm -rf /var/www/html/* && \
tar -xvzf /root/backup/hola.tgz -C /var/www/ && \
rm -rf /root/backup/hola.tgz && \
find /var/www/html/presta_dir -type f -exec sed -i "s/'database_host' => '127.0.0.1'/'database_host' => '172.17.0.2'/g" {} \; && \
find /var/www/html/presta_dir -type f -exec sed -i "s/'database_port' => ''/'database_port' => '3306'/g" {} \; && \
find /var/www/html/presta_dir -type f -exec sed -i "s/'database_user' => 'db_user'/'database_user' => 'root'/g" {} \; && \
rm -rf /var/www/html/presta_dir/var/cache/prod/*
#chmod -R 755 /var/www/html/presta_backup - no hace falta esto
#genera certificados y keys para https
RUN openssl req \
-x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/key.pem \
-out /etc/ssl/certs/cert.crt -sha256 -days 365 \
-subj '/C=US/ST=Oregon/L=Portland/CN=www.madboa.com'
#borra los sitios y añade https.conf que pilla cert y key generados anteriormente
RUN rm -rf /etc/apache2/sites-available/
COPY https.conf /etc/apache2/sites-available/
#añade parámetros necesarios en apache2.conf
RUN echo "ServerName 172.17.0.3" >> /etc/apache2/apache2.conf && \
echo "<Directory /var/www/html/presta_dir>\n\tOptions Indexes FollowSymLinks\n\tAllowOverride None\n\tRequire all granted\n</Directory>" >> /etc/apache2/apache2.conf
#habilita ssl
RUN a2enmod ssl
#habilita php7.4
RUN a2enmod php7.4
#habilita lbmethod_byrequests
RUN a2enmod lbmethod_byrequests
#cambia owner de presta_dir, habilita https.conf y comprueba que la sintaxis de la configuración esté bien
RUN chown www-data:www-data -R /var/www/html/presta_dir/ && \
a2ensite https.conf && \
apache2ctl configtest
#expone el puerto 443
EXPOSE 443
#ejecuta apache en primer plano detached, para hacer que el contenedor no se detenga o tener que forzarlo a que no se detenga
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]