1

I'm having real issues trying to pass variables into my docker container to dynamically update my xdebug.ini file;

I have the following simple docker-compose.yml

services:
  php:
    container_name: php
    build:
      context: .
    command: ["/usr/local/sbin/php-fpm", "-F", "-R"]
    expose:
      - "9003"
    env_file:
      - .env

My Dockerfile is basic

FROM propietary-image-here-custom-8.3-fpm

RUN apt-get update

RUN pecl install xdebug && docker-php-ext-enable xdebug.so
COPY ./xdebug.ini /usr/local/etc/php/conf.d/

CMD ["/usr/local/sbin/php-fpm", "-F", "-R"]

My .env is just one line;

XDEBUG_MODE=debug

and my xdebug.ini is as follows;

xdebug.mode=${XDEBUG_MODE}

I can boot it all up with docker compose up -d fine and if I run docker compose config i can see the variable.

But when I enter into the container with docker run -i -t php /bin/bash and execute env, its not there, and its not working with the xdebug.ini.

2
  • How do you enter into the container? Commented Feb 7 at 14:10
  • @HansKilian docker run -i -t php /bin/bash Commented Feb 7 at 14:15

1 Answer 1

2

its not working with the xdebug.ini.

Your xdebug.mode=${XDEBUG_MODE} in xdebug.ini is probably redundant: the XDEBUG_MODE parameter in the environment overrides the xdebug.mode ini setting.

Therefore, you can replace ${XDEBUG_MODE} in xdebug.ini with the mode you'd like to have -or- remove the setting completely if the default (= develop) already suits you.

Compare: string xdebug.mode = develop (xdebug.org), and find there as well this warning:

WARNING: Some web servers have a configuration option to prevent environment variables from being propagated to PHP and Xdebug.

For example, PHP-FPM has a clear_env configuration setting that is on by default, which you will need to turn off if you want to use XDEBUG_MODE.

Make sure that your web server does not clean the environment, or specifically allows the XDEBUG_MODE environment variable to be passed on.

For interpreting PHP-FPM phpinfo() output for the Xdebug3 extension, see as well Docker PHP with Xdebug 3 env XDEBUG_MODE doesn't work (Q&A).


The way you test the container environment is wrong. Instead of run, use exec:

$ cat .env
FOO=BAR
$ docker exec -i -t php php -r 'print_r(getenv());'
Array
(
    [PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    [HOSTNAME] => f30ed99b9fed
    [TERM] => xterm
    [FOO] => BAR
    [PHPIZE_DEPS] => autoconf       dpkg-dev        file        g++         gcc         libc-dev        make        pkg-config      re2c
    [PHP_INI_DIR] => /usr/local/etc/php
    [PHP_CFLAGS] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    [PHP_CPPFLAGS] => -fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    [PHP_LDFLAGS] => -Wl,-O1 -pie
    [GPG_KEYS] => AFD8691FDAEDF03BDF6E460563F15A9B715376CA 9D7F99A0CB8F05C8A6958D6256A97AF7600A39A6 0616E93D95AF471243E26761770426E17EBBB3DD
    [PHP_VERSION] => 8.4.3
    [PHP_URL] => https://www.php.net/distributions/php-8.4.3.tar.xz
    [PHP_ASC_URL] => https://www.php.net/distributions/php-8.4.3.tar.xz.asc
    [PHP_SHA256] => 5c42173cbde7d0add8249c2e8a0c19ae271f41d8c47d67d72bdf91a88dcc7e4b
    [HOME] => /root
)

This is what you configured docker compose to do. See Use the env_file attribute (docker.com):

Using an .env file lets you use the same file for use by a plain docker run --env-file ... command [bold by me]

If you insist to use docker run you have to add the --env-file switch on the command-line as you are running a new container independent to the configured composition:

$ docker run --env-file .env -i -t php php -r 'print_r(getenv());'
Array
(
    [HOSTNAME] => 7f87b21e6aac
    [PHP_INI_DIR] => /usr/local/etc/php
    ...
    [FOO] => BAR
    [PHPIZE_DEPS] => ...
)
Sign up to request clarification or add additional context in comments.

1 Comment

That works a treat .. Thank you so much

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.