首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker-组合- PHP实例似乎不与数据库服务通信。

docker-组合- PHP实例似乎不与数据库服务通信。
EN

Stack Overflow用户
提问于 2021-08-20 08:46:14
回答 4查看 1.3K关注 0票数 1

我正在开发一个基于dunglas/symfony-docker模板的项目,我想在其中添加一个postgres数据库。

看来我的停靠器compose.yml文件配置错误,因为postgres之间的通信出现故障。实际上,当我尝试执行symfony迁移时,原则会返回以下错误:

用户"postgres“密码身份验证失败

当我检查PHP日志时,我注意到PHP正在数据库后面等待

php_1还在等db准备好..。或者数据库是不可触及的。

我的船坞

代码语言:javascript
复制
version: "3.4"

services:
  php:
    links:
      - database
    build:
      context: .
      target: symfony_php
      args:
        SYMFONY_VERSION: ${SYMFONY_VERSION:-}
        SKELETON: ${SKELETON:-symfony/skeleton}
        STABILITY: ${STABILITY:-stable}
    restart: unless-stopped
    volumes:
      - php_socket:/var/run/php
    healthcheck:
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 30s
    environment:
      # Run "composer require symfony/orm-pack" to install and configure Doctrine ORM
      DATABASE_URL: ${DATABASE_URL}
      # Run "composer require symfony/mercure-bundle" to install and configure the Mercure integration
      MERCURE_URL: ${CADDY_MERCURE_URL:-http://caddy/.well-known/mercure}
      MERCURE_PUBLIC_URL: https://${SERVER_NAME:-localhost}/.well-known/mercure
      MERCURE_JWT_SECRET: ${CADDY_MERCURE_JWT_SECRET:-!ChangeMe!}

  caddy:
    build:
      context: .
      target: symfony_caddy
    depends_on:
      - php
    environment:
      SERVER_NAME: ${SERVER_NAME:-localhost, caddy:80}
      MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeMe!}
      MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeMe!}
    restart: unless-stopped
    volumes:
      - php_socket:/var/run/php
      - caddy_data:/data
      - caddy_config:/config
    ports:
      # HTTP
      - target: 80
        published: 80
        protocol: tcp
      # HTTPS
      - target: 443
        published: 443
        protocol: tcp
      # HTTP/3
      - target: 443
        published: 443
        protocol: udp

###> doctrine/doctrine-bundle ###
  database:
    image: postgres:${POSTGRES_VERSION:-13}-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-app}
      # You should definitely change the password in production
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ChangeMe}
      POSTGRES_USER: ${POSTGRES_USER:-symfony}
    volumes:
      - db-data:/var/lib/postgresql/data:rw
      # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
      # - ./docker/db/data:/var/lib/postgresql/data:rw
###< doctrine/doctrine-bundle ###

volumes:
  php_socket:
  caddy_data:
  caddy_config:

###> doctrine/doctrine-bundle ###
  db-data:
###< doctrine/doctrine-bundle ###

提取我的.env文件:

代码语言:javascript
复制
POSTGRES_DB=proximityNL
POSTGRES_PASSWORD=postgres
POSTGRES_USER=postgres
DATABASE_URL="postgresql://postgres:postgres@database:5432/proximityNL?serverVersion=13&charset=utf8"

你能帮我吗?

最诚挚的问候..。

更新:事实上,我在周六了解到,仅仅是有必要移除孤儿。

代码语言:javascript
复制
docker-compose down --remove-orphans --volumes
EN

回答 4

Stack Overflow用户

发布于 2021-08-20 08:53:29

在容器中运行时,127.0.0.1引用容器本身。Docker创建了一个虚拟网络,每个容器都有自己的IP地址。您可以通过容器的服务名称来对其进行寻址。

所以您的连接字符串应该指向database:5432而不是127.0.0.1:5432,如下所示

代码语言:javascript
复制
DATABASE_URL="postgresql://postgres:postgres@database:5432/proximityNL?serverVersion=13&charset=utf8"

您可以使用database,因为这是您的停靠器撰写文件中的postgresql容器的服务名称。

票数 1
EN

Stack Overflow用户

发布于 2021-08-20 08:56:37

在码头,你可以通过它的名字调用图像。

因此,请尝试为您的配置使用docker映像的名称。

代码语言:javascript
复制
DATABASE_URL="postgresql://postgres:postgres@database:5432/proximityNL?serverVersion=13&charset=utf8"

还可以在php和数据库映像之间添加一个链接。

代码语言:javascript
复制
services:
  php:
  links:
   - database

这就是我将java应用程序与mysql db连接起来的方式。

票数 0
EN

Stack Overflow用户

发布于 2021-08-20 09:26:49

Docker应该将DNS解析从Docker主机映射到您的容器中。

组合链接中的网络化

正因为如此,DB看起来应该是:"postgresql://postgres:postgres@database:5432/...“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68859409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档