我目前正在尝试用Docker建立一个开发环境,目标是有一个单一的Docker合成文件来启动所有必要的容器,并在容器内开发和测试代码。
现在我遇到了一个问题,在使用PhpStorm的内置Docker支持运行测试时,我的环境变量不可用。在运行docker compose exec api-internal-php vendor/bin/phpunit
时,我的所有测试都成功了,但在PhpStorm中运行测试时却没有成功。在这两种情况下,我都是在running container中执行测试,测试失败的原因是我在Docker Compose文件中定义的环境变量,以及连接到数据库所必需的环境变量,在PhpStorm中运行PHPUnit时不可用。我的Docker映像基于php:8.2-fpm-alpine。
我的系统配置(撰写本文时为最新):
- macOS 13.1
- Docker桌面4.15.0
- PHP Storm 2022.3.1
当然,我确保了我实际上是在使用Docker运行测试,我使用Docker网络,并通过使用服务名称连接到数据库,我可以确认我的环境变量的作用域是问题所在,因为当用它们的实际值替换代码中的环境变量时,即使在PhpStorm中测试也是成功的,这也意味着测试能够使用服务名称和Docker网络连接到数据库。
我在映像中安装了Xdebug,调试工作正常。通过在测试开始时添加断点,我可以确认$_ENV
数组中缺少变量。
我尝试了不同的方法,并寻找了几个小时的解决方案,但还没有成功。我尝试添加一个fpm配置文件与我的环境变量一样,this post建议,这没有帮助。否则,我没有找到任何问题与完全相同的问题。
我的Docker合成文件的相关摘录:
api-internal-php:
build:
context: .
dockerfile: dockerfiles/php.dockerfile
args:
APP_ENV: dev
SYMFONY_DIRECTORY: backend-api-internal
restart: unless-stopped
volumes:
- ./backend-api-internal:/var/www/html:ro
- ./backend-api-internal/var:/var/www/html/var
- ./backend-api-internal/vendor:/var/www/html/vendor
- ./backend-api-internal/.phpunit.result.cache:/var/www/html/.phpunit.result.cache
environment:
DB_ANSWERS_URL: mysqli://root:local@mariadb/
DB_DEV_NAME: dev_env_db
DB_TEST_NAME: test_env_db
depends_on:
- mariadb
- model
一个有趣的旁注:我在容器中的应用程序/工作目录显然是/var/www/html
。不知何故,PhpStorm使用/opt/project
作为路径Map。正如我所说的,当将代码中的环境变量替换为它们的实际值时,测试运行良好,所以我不认为这是问题所在。
1条答案
按热度按时间6yjfywim1#
所以事实证明,如果你知道如何使用它,PhpStorm中的Docker集成工作得相当好。我犯的错误是首先将CLI解释器设置为“Docker”而不是“Docker Compose”,然后,当切换到“Docker Compose”时,没有选择正确的“Lifecycle”选项。
首先,要在Docker容器中执行测试,请转到“PHP〉CLI Interpreter”设置,单击三个点并创建一个新点。...”,然后如果您的设置基于Docker合成配置YAML文件,请确保选择“Docker合成”。您可以在此处选择配置文件和服务。您无需在“环境变量”。
点击“OK”,最后,要在运行的容器中执行测试,请将“Lifecycle”设置更改为“Connect to existing container”(连接到现有容器)。实际上,这将使用
docker compose exec
命令而不是docker compose run
。感谢**@Foobar**提供的解决方案!