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] => ...
)
docker run -i -t php /bin/bash