Xdebug doesn't get enabled in docker container - php

I'm using richovery/nginx-php-fpm. Everything works fine but I've faced with a problem on enabling the xdebug. As I read the documentation the xdebug is installed by default in the container and only thing to enabling it is adding ENABLE_XDEBUG= 1 environment variable to docker-compose.yml file so I tried it but no result! So I decided to enable it manually in my Dockerfile by running the command docker-php-ext-enable xdebug. While compiling I see some execution results in terminal which are associated with this job however when I dump the phpinfo() I can't see anything related to the xdebug. Also the docker-php-ext-xdebug.ini does not exists in the /usr/local/etc/php/conf.d/ directory. And the funny part is when I go into the container and run the command docker-php-ext-enable xdebug and restart the php-fpm it works like a charm.
Here is my docker-compose.yml file:
version: "3.1"
services:
admin_panel_web:
build: ./nginx
ports:
- 81:80
volumes:
- ../src:/var/www
working_dir: /var/www
admin_panel_mysql:
build: ./mysql
ports:
- 3307:3306
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: admin_panel
MYSQL_USER: tohid
MYSQL_PASSWORD: 123456
volumes:
- ../data/mysql:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
admin_panel_redis:
build: ./redis
ports:
- 6380:6379
volumes:
- ../data/redis:/data
And my Dockerfile
FROM richarvey/nginx-php-fpm:1.8.2
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Configure nginx
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
ADD conf/nginx-site.conf /etc/nginx/sites-available/default.conf
ADD conf/nginx-site-ssl.conf /etc/nginx/sites-available/default-ssl.conf
RUN docker-php-ext-enable xdebug
ADD conf/xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

Related

Docker container can't call localhost inside container itself

I have a docker-compose environment setup.
But inside service "Lumen" im trying to make a CURL request to the service itself.
However, the container can't access itself from localhost:8000 OR lumen:8000??
When I call lumen:8000 from the service it just never returns a response and just keeps loading ( And the curl request is to a different url so no infinite loop )
In my Laravel controller I found the protocal, host and port to be: http://lumen:8000
I seems like Laravel can't connect to itself, which I really need for my project.
I can connect to the Laravel from my own computer through localhost, but I need the Laravel to call it self.
Error message from Laravel controller after doing a CURL request:
Failed to connect to localhost port 8000 after 0 ms: Connection refused
Changing host to "lumen" just makes the request load infinite. No matter what page I try to connect to.
Docker-compose file:
version: "3.5"
services:
lumen:
expose:
- "8000"
ports:
- "8000:8000"
volumes:
- ./server:/var/www/html
- ./server/vendor:/var/www/html/vendor/
build:
context: server
dockerfile: Dockerfile
command: php -S lumen:8000 -t public
restart: always
privileged: true
depends_on:
- database
networks:
- database
frontend:
build:
context: client
dockerfile: Dockerfile
volumes:
- ./client/src:/app/src
ports:
- 3000:3000
stdin_open: true
#restart: always
networks:
- database
# Database Service (Mysql)
database:
image: mysql:latest
container_name: blogmoda_mysql
environment:
MYSQL_DATABASE: blogmoda-app
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ROOT_PASSWORD: root
command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-authentication-plugin=mysql_native_password']
ports:
- "127.0.0.1:3306:3306"
volumes:
- db-data:/var/lib/mysql
networks:
- database
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: dev_phpmyadmin
links:
- database
environment:
PMA_HOST: database
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
depends_on:
- database
ports:
- 9001:80
networks:
- database
volumes:
db-data:
# Networks to be created to facilitate communication between containers
networks:
database:
Server dockerfile:
FROM php:8.1-fpm-alpine
RUN apk update && apk add bash
RUN apk add chromium
RUN apk add --no-cache zip libzip-dev
RUN docker-php-ext-configure zip
RUN docker-php-ext-install zip
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install opcache
WORKDIR /var/www/html/
RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer
COPY . .
RUN composer install --ignore-platform-req=ext-zip --ignore-platform-reqs
I believe localhost should work. Assuming curl is installed in lumen, in your compose file under the lumen service can you try changing your command
command: php -S lumen:8000 -t public
to a direct curl via bash as
command: sh -c "curl -s localhost:8000"
Then check the logs of the lumen container to see whether or not the curl ran successfully.
Try 0.0.0.0:8000 instead localhost:8000. It works for localhost too

Docker-compose and including files from outside the WORKDIR

I want to use Docker with APACHE, PHP, MYSQL projects with files structure like in Laravel where there is a 'public' folder with a public files and all of the apps files are one level higher in.ex. app, modules, node, vendor etc.
I can setup docker-compose.yml file and Dockerfile to create docker container with APACHE-PHP, MYSQL and PHPMYADMIN and it's working but all of files one level higher that WORKDIR is unavailable.
My problem is I can't setup this container to properly use my app. Simple PHP script below is not working. What should I do?
[public/index.php]
<?php
echo "index.php";
require_once __DIR__ . "/../include.php";
[docker-compose.yml]
version: '3.9'
services:
php-env:
build: .
volumes:
- ./public:/var/www/html
ports:
- 8000:80
mysql-db:
image: mysql:latest
ports:
- 3306:3306
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
MYSQL_ROOT_PASSWORD: ${DB_PASS}
[Dockerfile]
FROM php:8.1-apache
WORKDIR /var/www/html
RUN apt-get update -y && apt-get install -y libmariadb-dev
RUN docker-php-ext-install mysqli

Docker php:php7.4-apache boot-loop after installing mysqli extension

i am currently trying to run my Website in a Docker container using mysql and php with apache.
Docker-Compose:
version: '3.7'
services:
mysql:
image: mysql:latest
container_name: mysql
restart: always
environment:
//Database configuration variables
volumes:
- ./data/mysql/database:/var/lib/mysql
webserver:
image: php:7.4.12-apache
depends_on:
- mysql
restart: always
volumes:
- ./data/webserver:/var/www/html/
ports:
- 8888:80
command: bash -c "docker-php-ext-install mysqli && kill -HUP 1"
phpmyadmin:
depends_on:
- mysql
image: phpmyadmin:latest
container_name: phpmyadmin
links:
- mysql:db
restart: always
ports:
- 8889:80
volumes:
- /sessions
The problem began after i added the command-block to the webserver-container. Without it, the container runs perfectly and i can access the website. But with the command, the container gets stuck in a boot-loop and it seems that it tries to run the command over and over. At least thats what i guess after looking at the log of the webserver container.
However when i use docker exec -it *webserver* bash and run the installation command directly in the container, it works perfectly. I then restart apache with kill -HUP 1 and the Website works as intended. Does anyone know what the problem is here?
Have you tried doing the install and apache restart inside a Dockerfile instead?
Something like:
FROM php:7.4.12-apache
RUN apt-get clean && apt-get update && apt-get install -y php7.4-mysqli;
RUN service apache2 restart;
Then your docker-compose could be:
[...]
webserver:
build:
context: .
dockerfile: docker/webserver/Dockerfile
depends_on:
- mysql
restart: always
volumes:
- ./data/webserver:/var/www/html/
ports:
- 8888:80
[...]

Docker: PhpMyAdmin has an upload limit of 2048KiB

i have a docker-compose.yml that looks like this:
webserver:
build: ./_docker/php
ports:
- 80:80
links:
- mysql
volumes_from:
- app
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: "${DB_NAME}"
MYSQL_USER: "${DB_USER}"
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PW}"
MYSQL_PASSWORD: "${DB_PW}"
volumes:
- ./_docker/data/db:/docker-entrypoint-initdb.d
volumes_from:
- data
data:
image: mysql:5.7
volumes:
- /var/lib/mysql
command: "true"
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- 8080:80
links:
- mysql
environment:
PMA_HOST: mysql
app:
image: tianon/true
volumes:
- .:/var/www/public_html
Dockerfile looks like this:
FROM php:7.0-apache
#php:7.2.2-apache
#php:5.6.33-apache
COPY php.ini /usr/local/etc/php/
COPY 000-default.conf /etc/apache2/sites-available/
RUN a2enmod rewrite
RUN a2enmod expires
RUN a2enmod headers
RUN apt-get update
RUN apt-get install -y zlib1g-dev libxml2-dev libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng12.0 imagemagick
RUN docker-php-ext-install mysqli zip soap
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install gd
# Install opcache
RUN docker-php-ext-install opcache
and the php ini like this:
max_input_vars = 1500
max_execution_time = 300
post_max_size=50M
upload_max_filesize=50M
when i start the container i have my webserver located on http://localhost.
i put an index.php with a phpinfo(); inside it and it shows, that the php.ini works.
When i open http://localhost:8080 and login to PMA it shows me that my upload limit i set to 2048KiB.
Where can i change this?
Thanks in advance!
Use like this UPLOAD_LIMIT env in docker. This is from my docker-compose.yml. Default value for UPLOAD_LIMIT is 2048K which is 2048KiB. Setting value to 300M increases it to 300MiB.
Reference: https://github.com/phpmyadmin/docker#environment-variables-summary
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: 'php7.3-phpmyadmin'
restart: 'always'
links:
- mysql
environment:
PMA_HOST: mysql
PMA_PORT: 3306
UPLOAD_LIMIT: 300M
ports:
- '8082:80'
volumes:
- /sessions
I implemented UPLOAD_LIMIT ENV variable in
https://github.com/phpmyadmin/docker/pull/261/files#diff-80edf79b0f382a3c6e871ac209ffd6abR57
you need to use UPLOAD_LIMIT inside enviroment, and you need to specify values with = sign, like example: UPLOAD_LIMIT=300M
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: somerandompasswordgenerated
ports:
- 3306:3306
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
- PMA_ARBITRARY=1
- UPLOAD_LIMIT=300M
UPLOAD_LIMIT: 500M
mariadb:
image: mariadb:latest
container_name: w-mariadb
restart: always
ports:
- "3307:3306"
environment:
MYSQL_DATABASE: db_name
MYSQL_USER: root
MYSQL_PASSWORD: db_password
MYSQL_ROOT_PASSWORD: db_password
volumes:
- 'w-mariadb:/var/lib/mysql'
networks:
- w-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: w-phpmyadmin
links:
- mariadb
environment:
MYSQL_ROOT_PASSWORD: db_password
PMA_HOST: mariadb
UPLOAD_LIMIT: 500M
restart: always
ports:
- '8383:80'
networks:
- w-network
In my case I couldn't fix it with UPLOAD_LIMIT, so without further debugging I needed a quick solution even if it's temporary:
open phpmyadmin container terminal: docker exec -it container_name bash
If you don't have vim or nano editor install one: apt-get update, apt-get install vim
create config file: vi /usr/local/php/conf.d/myconf.ini
with this content: post_max_size=50M upload_max_filesize=50M
restart container
Remember these changes will be gone when container is recreated, it's just a temporary solution. Try working with UPLOAD_LIMIT as suggested in previous answer.
UPDATE
Tried again with setting upload_limit environment, but still without luck, so found another solution:
created a file say uploads.ini with this content:
post_max_size=50M
upload_max_filesize=50M
and link it to container volume :
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- mysql:db
ports:
- 8084:80
volumes:
- ./uploads.ini:/usr/local/etc/php/conf.d/php-phpmyadmin.ini
environment:
MYSQL_ROOT_PASSWORD: something
#UPLOAD_LIMIT: 3000000000 <-- didn't work
the following worked very well.
My docker-compose.yml contains this:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: some-name
env_file:
- phpmyadmin.env
depends_on:
- mariadb
volumes:
The following entry was added to the phpmyadmin.env: UPLOAD_LIMIT=256MB
The larger number (Maximal: 256MiB) showed up right after the container was brought down and was back up again.
If you want to install from phpmyadmin docker image and with docker run, you can exec this.
docker run --name your-image-name -d --link mysql-docker:db --env "UPLOAD_LIMIT=256M" phpmyadmin
This works for me and enable upload to 256MB SQL file.
I edit this file :
/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
and set new values :
post_max_size=64M
upload_max_filesize=64M
It works fine.

cannot connect mysql and php

Having this lamp docker setup (Im a sort of docker newbie):
docker-compose.yml
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- ./:/var/www/html
links:
- db
db:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=adminpasswd
- MYSQL_DATABASE=se_racken_dev
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "88:80"
links:
- db:db
Dockerfile
FROM php:5.6-apache
RUN apt-get update -y && apt-get install -y libpng-dev curl libcurl4-openssl-dev
RUN docker-php-ext-install pdo pdo_mysql gd curl
RUN a2enmod rewrite
RUN service apache2 restart
Just cant get my local environment to work.
Get this error message at localhost:8088:
SQLSTATE[HY000] [2002] No such file or directory
How can I configure my docker setup to get past this connection problem?
Got some hints here:
Starting with Zend Tutorial - Zend_DB_Adapter throws Exception: "SQLSTATE[HY000] [2002] No such file or directory"
Do I need to install vim and do what they suggest in above or can I solve it in my docker files?
On webserver image you should define the connection values such as database's hostname,database name, username and password.
What can you can is to specify a .env file as seen in https://docs.docker.com/compose/env-file/
In your case that should be:
DB_HOSTNAME=db:/var/run/mysqld/mysqld.sock
DB_USER=root
DB_PASSWORD=somepassword
DB_NAME=se_racken_dev
Then to your Dockerfile specify:
FROM php:5.6-apache
ENV MYSQL_HOSTNAME="localhost"
ENV MYSQL_PASSWORD=""
ENV MYSQL_USERNAME="root"
ENV MYSQL_DATABASE_NAME=""
RUN apt-get update -y && apt-get install -y libpng-dev curl libcurl4-openssl-dev
RUN docker-php-ext-install pdo pdo_mysql gd curl
RUN a2enmod rewrite
RUN service apache2 restart
Then modify your docker-compose.yml like that:
version: '2'
services:
webserver:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- ./:/var/www/html
links:
- db
environment:
- MYSQL_HOSTNAME=$DB_HOSTNAME
- MYSQL_PASSWORD=$DB_USER
- MYSQL_USERNAME=$DB_PASSWORD
- MYSQL_DATABASE_NAME=$DB_NAME
db:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- /var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=$DB_PASSWORD
- MYSQL_DATABASE=$DB_NAME
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "88:80"
links:
- db:db
Then you can use php's getenv to retreive the values from enviromental variables you specified. eg In your case the getenv('MYSQL_DATABASE_NAME') will retreive the value "se_racken_dev" as a string. So you need to modify the database configuration file in order to retreive correctly the database connection credentials using the function mewntioned above.
A simple way to remember is whatever you specify via ENV in your dockerfile you can retreive via getenv.

Categories