Docker-Compose Wordpress: wp_mail() not working - php

I run a WordPress installation in a docker-container with the WordPress image (https://hub.docker.com/_/wordpress/). My problem is that I can't send mails via wp_mail() or with PHP mail().
When I try to call a mail()-function I get an "Internal Server Error".
What can I do? Do I need a external mail server?
My docker-compose.yml:
wordpress:
image: wordpress
container_name: shk_wordpress
links:
- mariadb:mysql
environment:
- WORDPRESS_DB_PASSWORD=admin
ports:
- "8000:80"
volumes:
- ./app:/var/www/html
- ./theme/:/var/www/html/wp-content/themes/shk-theme
mariadb:
image: mariadb
container_name: shk_mariadb
environment:
- MYSQL_ROOT_PASSWORD=admin
- MYSQL_DATABASE=wordpress
volumes:
- ./database:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: shk_phpmyadmin
environment:
- PMA_ARBITRARY=1
- MYSQL_USER=root
- MYSQL_PASSWORD=admin
- MYSQL_ROOT_PASSWORD=admin
ports:
- "9000:80"
links:
- "mariadb:mysql"

It seems that this problem was already been discused at WP docker image repo.
Checkout this answer on
Github
Further down you might find some other solutions to your problem if that one doesn't work.

Step 1 :
In your docker-compose.yml, replace
image: wordpress
by
build: .
Step 2 :
Create a Dockerfile :
FROM wordpress
RUN apt-get update
RUN apt-get install -y ssmtp
RUN echo "sendmail_path = /usr/sbin/ssmtp -t" >> /usr/local/etc/php/conf.d/sendmail.ini
RUN sed -i -e 's/mailhub=mail/mailhub=[IP RELAY SERVER]/' /etc/ssmtp/ssmtp.conf
RUN sed -i -e 's/#rewriteDomain=/rewriteDomain=[IP RELAY SERVER]/' /etc/ssmtp/ssmtp.conf
RUN sed -i -e '/hostname=/d' /etc/ssmtp/ssmtp.conf
Step 3 :
Replace [IP RELAY SERVER]

Related

Difference between running docker and docker compose

I am working with an docker image nanoninja/php-fpm:8.1.
When I run the image manually, the PHP works.
docker container run --rm --name phpfpm -v $(pwd):/var/www/html -p 3000:3000 nanoninja/php-fpm php -S="0.0.0.0:3000" -t="/var/www/html"
But when I try to run the same image with docker-compose.yml file, I don't get a connection to PHP.
Here is my very simple docker-compose.yml file:
version: '3'
services:
php:
image: nanoninja/php-fpm:8.1
restart: always
ports:
- 3000:9000
stdin_open: true
tty: true
I'm not using a Dockerfile.
Question: How to run PHP without Nginx using only docker-compose.yml file?
Image link: https://github.com/nanoninja/php-fpm
The docker-compose file equivalent to your docker container run command would be something like
version: "3"
services:
php:
image: nanoninja/php-fpm:8.1
container_name: phpfpm
restart: always
ports:
- 3000:3000
command: php -S="0.0.0.0:3000" -t="/var/www/html"
volumes:
- ./:/var/www/html
The -v option becomes the volumes: section. The part after the image name becomes the command:. The -p option becomes the ports: section. --name becomes container_name:, etc.

Docker "/usr/bin/php" not found in container

I am using docker for my app that includes freeradius,nginx and php.
I want to use "program = "/usr/bin/php " this command in container freeradius but it is not working.
In freeradius container I want to run this command "/usr/bin/php" but it says command not found.
Can anyone help me in this ?
version: '3.2'
services:
freeradius:
image: "ronakzenexim/2stacks_freeradius:v1"
environment:
- RAD_DEBUG=yes
depends_on:
- mysql
- php
links:
- mysql
restart: always
networks:
- backend
php:
image: "ronakzenexim/phpfpm72_mycrypt"
restart: always
volumes:
- "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
- "./web:/var/www/html"
networks:
- backend
networks:
backend:
ipam:
config:
- subnet: 10.0.0.0/24
Create a extension of the freeradius docker image for example
FROM ronakzenexim/2stacks_freeradius:v1
# Now install php
RUN apk update && apk upgrade
RUN apk add php7 php7-fpm php7-opcache
In this container you can run php.

xdebug 3 not working in ubuntu 20.04 with docker

I'm trying to use xdebug 3 with docker on ubuntu 20.04, but I'm not getting success,
xdebug does not enter the interruption point, I already searched for everything and no answer solved my problem, it would be something about the docker host, because the same configuration is the right one in windows, I don't know what else I can try to solve the problem,
I would like a help to understand what I'm doing wrong, below is my configuration.
My docker-compose file
version: '3.7'
networks:
supervisao:
services:
nginx:
image: nginx:stable-alpine
container_name: supervisao-web
ports:
- "80:80"
volumes:
- .:/var/www/html/
- ./.docker/web/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
- mysql
networks:
- supervisao
mysql:
image: mysql:latest
container_name: supervisao-db
command: --default-authentication-plugin=mysql_native_password
restart: always
tty: true
ports:
- "3306:3306"
volumes:
- ./.docker/mysql/:/var/lib/mysql
environment:
MYSQL_DATABASE: supervisao
MYSQL_USER: user
MYSQL_PASSWORD: pass
MYSQL_ROOT_PASSWORD: pass
SERVICES_TAGS: dev
SERVICES_NAME: mysql
networks:
- supervisao
php:
build:
context: .
dockerfile: Dockerfile
container_name: supervisao-php
volumes:
- .:/var/www/html/
- ./.docker/php/docker-xdebug.ini:/usr/local/etc/php/conf.d/php-docker.ini
ports:
- "9000:9000"
networks:
- supervisao
redis:
image: redis:latest
volumes:
- ./.docker/redis:/data
ports:
- 6379:6379
networks:
- supervisao
my xdebug.ini
# File: docker-xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
xdebug.discover_client_host=1
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.log = /var/www/html/xdebug.log
I appreciate if someone can collaborate, thank you
Make sure you have xdebug 3 loaded in PHP.
Create the phpinfo.php file
<?php
phpinfo();
Surf to it to check that xdebug is loaded by PHP and is version 3.
If the xdebug is version 2.x then you can install v3 with pecl instead.
If you have shell access to your docker box you can try the pecl command directly and see in phpinfo if you got xdebug v3.
In your DockerFile:
# PECL
RUN mkdir -p /tmp/pear/cache
RUN pecl channel-update pecl.php.net
RUN apt install -y php-pear
COPY xdebug.ini "/etc/php/${PHP_VERSION}/mods-available/xdebug.ini"
# The xdebug distributed with Ubuntu 20.04 LTS is v2.9.2, we want v3.0.x
RUN pecl install xdebug
# Enable xdebug by default
RUN phpenmod xdebug
In your xdebug.ini
zend_extension=xdebug.so
xdebug.default_enable = On
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=yes
xdebug.max_nesting_level = -1
xdebug.log = "/var/www/log/xdebug.log"
xdebug.output_dir = "/var/www/log/profiler"
Now you could rebuild the docker boxes
docker stop
docker build --no-cache
docker up
Check in phpinfo if you got the settings enabled.
If you have shell access to your docker box you can look at the log file.
tail -n 100 /var/www/log/xdebug.log
If you run PHP Storm there is an excellent validator in PHP Storm >> File >> Settings >> Languages & Frameworks >> PHP >> Debug
Click the link "Validate". Set local web server path to your public folder. Validation script to your webb address. Works good on shared folders and not so good on synced folders.
If you run Ubuntu as host then look at the firewall settings.
"9000/tcp ALLOW IN Anywhere" and the same for port 9003. Or try temprarily to disable the firewall.
I also added port 9003:9003 to the DockerFile. But have not tested if that makes any difference.
Hope any of this was of help to you.
In my case, disabling firewall did the trick - sudo ufw disable

Composer memory limit docker

I have a problem with composer install on docker. This is my docker-compose file:
version: '3'
services:
webserver:
image: nginx:latest
ports:
- 80:80
- 433:433
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./:/var/www/html/
links:
- php-fmp
- db
networks:
- app-network
php-fmp:
build: docker/php-fmp
volumes:
- ./:/var/www/html/
ports:
- 9000:9000
links:
- db
networks:
- app-network
db:
image: mysql
ports:
- 3306:3306
volumes:
- /var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
- MYSQL_DATABASE=goexpress
- MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_ROOT_PASSWORD=docker
networks:
- app-network
networks:
app-network:
driver: bridge
I try to execute docker-compose run php-fmp composer install it starts after some minutes it shows memory limit xxxxxxxxx. I have tried also memory_limit=-1.
My laptop memory: 6GB.
In another pc it works perfect.
Before upgrade of memory it has worked. Memory before was 4GB now it is 6GB. The project that I want to run is symfony.
Composer has its own COMPOSER_MEMORY_LIMIT environment variable, but uses php.ini's memory_limit by default when its own variable is not set. https://getcomposer.org/doc/03-cli.md#composer-memory-limit
With Docker Compose you will need to pass COMPOSER_MEMORY_LIMIT as an environment variable to the container where Composer is installed. Your docker-compose.yml file would look like this:
services:
php-fmp: //the name of your container (as per your question)
environment:
- COMPOSER_MEMORY_LIMIT=-1 //-1 means unlimited
This environment variable would be taken into account every time you run Composer with docker-compose:
docker-compose exec php-fmp composer [your composer command]
Instead of php -d memory_limit=-1 composer install try COMPOSER_MEMORY_LIMIT=-1 composer install. Composer starts a new php process, that does not adhere to the setting you provide and it might even override the config (I'm not a 100% sure about that).
If that still does not help open the preferences for Docker (by clicking on the icon in the task bar) under the Advanced tab you can specify how many cores and how much memory docker is allowed to consume. I think the default is 2GB and you might want to change that to e.g. 4GB.

How to install PHP Composer on a Limesurvey Docker image

Forgive me if this is an obvious question. I am fairly new to docker and I am having trouble understanding the installation instructions here:
https://hub.docker.com/_/composer/
I want to use PHP Composer in my Limesurvey docker image that was generated with the following docker-compose "yml" file:
limesurvey-md:
image: mariadb
restart: always
ports:
- "32805:3306"
environment:
MYSQL_DATABASE: limesurvey
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: limesurvey
MYSQL_PASSWORD: password
volumes:
- limesurvey-db:/var/lib/mysql
- limesurvey-dblog:/var/log/mysql
- limesurvey-dbetc:/etc/mysql
limesurvey:
image: fjudith/limesurvey
restart: always
ports:
- "32705:80"
volumes:
- limesurvey-upload:/var/www/html/upload
links:
- limesurvey-md:mysql
What do I need to add to my yml file to accomplish this? If it helps, there is a directory called "application" in the Limesurvey image:
/var/www/html/application
And how do I give this composer a command while it is in the container? I am using Windows 10 and the docker container is running the default linux environment. fjudith's Limesurvey container is using the last 2.X branch of Limesurvey (the one right before 3.X) and it is running PHP 7.2
You can create a custom image with a dockerfile build, yo can specify the dockerfile name in the build section, the docker-compose.yml and dockerfile are in the same folder here i attach and example:
docker-compose.yml:
version: '3.1'
services:
limesurvey-md:
image: mariadb
restart: always
ports:
- 32805:3306
environment:
MYSQL_DATABASE: limesurvey
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: limesurvey
MYSQL_PASSWORD: password
volumes:
- limesurvey-db:/var/lib/mysql
- limesurvey-dblog:/var/log/mysql
- limesurvey-dbetc:/etc/mysql
limesurvey:
build:
context: .
dockerfile: dockerfile
restart: always
ports:
- 32705:80
volumes:
- limesurvey-upload:/var/www/html/upload
links:
- limesurvey-md:mysql
volumes:
limesurvey-db:
driver: local
limesurvey-dblog:
driver: local
limesurvey-dbetc:
driver: local
limesurvey-upload:
driver: local
dockerfile:
FROM "fjudith/limesurvey:latest"
LABEL maintainer="ing.brayan.cm#gmail.com"
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Thanks Brayan! I just (10 minutes ago) figured out another way, you can also do a bash command. Since I was in Windows the two lines I had to do in my command prompt were
docker exec -it <my_container_name> bash
Then it put me into "/var/www/html#" where I did the following command:
$sudo curl -o /tmp/composer-setup.php https://getcomposer.org/installer && curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig && php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" && php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot && rm -f /tmp/composer-setup.*
I adapted the second line from here: Get composer (php dependency manager) to run on a docker image build
From there it's easy! You can just do
composer
and it guides you through the possible commands. It suggests not using the "root" administrator. I'll have to look into creating another user in the docker image.

Categories