Dockerise Symfony和PostgreSQL数据库,生产中没有数据,开发中没有问题

r7s23pms  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(121)

我有一个symfony 6.3 web应用在docker容器(php-fpm-alpine)中,它使用了mysql容器。在将mysql数据库迁移到postgresql后,我更新了.env DATABASE_URL以切换到postgresql数据库,它在dev中运行良好,它可以检索数据库中的数据!我想在生产中推送,如果 我没有正确设置postgresql密码(错误500 docker日志返回:connection to server at "my_postgres_service_name" (x.x.x.x), port xxxx failed: FATAL: password authentication failed for user,设置正确后,我没有更多的错误.但我不检索任何数据!

php bin/console doctrine:mapping:info returns all entities [OK]
        php bin/console doctrine:schema:validate returns :  

Mapping
-------

 [FAIL] The entity-class App\Entity\Sample mapping is invalid:
 * The field App\Entity\Sample#result is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity App\Entity\Result#sample does not contain the required 'inversedBy="result"' attribute.

Database
--------

 [OK] The query yielded an empty result set.

字符串
校正后:

Mapping
-------                                                                                                                      
 [OK] The mapping files are correct.                                                                                    
Database
--------

[critical] Error thrown while running command "'d:s:v'". Message: "Environment variable not found: "MESSENGER_TRANSPORT_DSN"."

In EnvVarProcessor.php line 187:
                                                              
  Environment variable not found: "MESSENGER_TRANSPORT_DSN".  

2023-10-20T13:21:49+00:00 [info] User Deprecated: The annotation mapping driver is deprecated and will be removed in Doctrine ORM 3.0, please migrate to the attribute or XML driver. (AnnotationDriver.php:68 called by App_KernelDevDebugContainer.php:1355, https://github.com/doctrine/orm/issues/10098, package doctrine/orm)
2023-10-20T13:21:49+00:00 [info] User Deprecated: Column::setCustomSchemaOptions() is deprecated. Use setPlatformOptions() instead. (Column.php:424 called by Column.php:92, https://github.com/doctrine/dbal/pull/5476, package doctrine/dbal)


但在开发中,它总是运行良好。
我有不同的版本到PHP,所以我切换到PHP的开发和生产8.2.11没有关于我的问题的变化
我检查了env文件,更改 DATABASE_URL 数据库密码->错误500,放回去,没有错误......但总是没有数据
I tested a DBAL access SELECT * FROM an_usual_table -> ok en dev,error 404 in prod  
如果我连接到数据库容器docker exec -it database_postgresql_container psql -U read-write-username database-name并运行上述请求,它会正确返回记录,因此使用的用户角色具有正确的权限
正如解释en https://stackoverflow.com/a/49045589/6614155,我试图在实体中添加@ORM\Table(schema="my-schema-name"),dev中没有变化(总是正确运行),prod中没有变化(总是没有数据)
我也有一个postgREST容器在postgresql数据库上有API,在dev和prod中有相同的端口。
我花了几天时间搜索,我不明白。帮助欢迎!

编辑:为了摆脱symfony和教条,我创建了一个文件,其中包含读取表的最少代码。如果我在我的dev主机上运行它,它很好,但如果我从我的容器运行它,我会得到错误Call to undefined function pg_connect()

phpinfo()在我的(dev)主机上返回(php安装了phpbrew,与dev/prod中的版本相同):

Configure Command =>  './configure' … '--with-pgsql=/usr/bin' '--with-pdo-pgsql=/usr/bin'

    PDO

    PDO support => enabled 

    PDO drivers => mysql, pgsql pdo_mysql
    pdo_pgsql

    PDO Driver for PostgreSQL => enabled

    PostgreSQL(libpq) Version => 14.9
…


在docker php container(dev和prod)中:
我有

PDO

    PDO support => enabled 

    PDO drivers => mysql, pgsql pdo_mysql
    pdo_pgsql

    PDO Driver for PostgreSQL => enabled

    PostgreSQL(libpq) Version => 15.4


但没有--with-pdo-pgsql也没有--with-pgsql
即使我在我的Dockerfile中有:

RUN apk --no-cache update \ 
    && apk --no-cache add bash icu-dev libzip-dev zip postgresql-dev \ 
    && docker-php-ext-configure intl \ 
    && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \ 
    && docker-php-ext-install pdo pdo_pgsql intl zip \ 
    && echo "Europe/Paris" > /etc/timezone


我在我的php.ini中没有改变任何东西,但我正确地理解了,docker-php-ext-configure或install这样做
即使这是一个线索,它也不能解释为什么它在开发中有效,而在生产中无效!

hgncfbus

hgncfbus1#

经过多次测试,我运行了一个简单的php连接到postgres,没有使用symfony/doctrine,基于https://www.php.net/manual/en/pgsql.examples-basic.php和相同的问题,没有数据,没有错误。
所以我连接到我的postgresql容器,运行

\dn
          List of schemas
   Name   |          Owner          
----------+-------------------------
my-schema-name | <user_name>
 public   | postgres
(2 rows)

<my_data_base_name>=# select * from period_list; # request on default schema -> public !!!!
 id | fr_name | gb_name | wiki_data_alignment | bnf_alignment
----+---------+---------+---------------------+---------------
(0 rows)

<my_data_base_name>=# select * from my-schema-name.period_list; # if I define my app schema name, I have got correct datas
 id |        fr_name        |       gb_name       | wiki_data_alignment | bnf_alignment
----+-----------------------+---------------------+---------------------+---------------
  1 | Paléolithique         | Paleolithic         | Q40203              | 
  2 | …

字符串
并理解我可能会犯错误,而不是在公共模式中定义相同的表。
解决方案:
请注意,如果你使用postgis,postgis默认安装使用 public schema(cf. https://www.postgis.net/workshops/postgis-intro/schemas.html

DROP SCHEMA public CASCADE; # delete public default schema, unused
ALTER DATABASE <my_data_base_name> SET search_path = <my-user-name>,<my-schema-name>


第二行是一个变通方案,我在SF中测试@ORM\Table('my-schema-name.my-table'),但在prod中不起作用(可能是缓存问题)......我应该找到正确的解决方案来定义SF中的模式。
关于帮助我https://stackoverflow.com/a/9067777/6614155的默认架构的链接

相关问题