Falha ao conectar-se ao MySQL: Nenhum arquivo ou diretório

3

Eu escrevi este projeto docker-compose. O docker-compose.yml é semelhante ao seguinte:

version: '3.1'

services:
  db:
    image: mysql
    restart: always
    environment:
      - MYSQL_DATABASE=mgsv
      - MYSQL_USER=mgsv_user
      - MYSQL_PASSWORD=mgsvpass
      - MYSQL_ROOT_PASSWORD=mysql123
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d

  www:
    build: ./mGSV 
    restart: always
    ports:
      - 8080:80

O index.php é semelhante ao seguinte:

<?php
echo "Hello World!";
//mysqli_connect("localhost","my_user","my_password","my_db");
$con = mysqli_connect("localhost","mgsv_user","mgsvpass","mgsv");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
  else {
     echo "done";
  }
?>

E o Dockerfile é baseado em um contêiner PHP e se parece com isso.

FROM php:5-apache

RUN apt-get update  && apt-get install -y --no-install-recommends \
                openjdk-7-jdk \
                maven  \
        git \
        && rm -rf /var/lib/apt/lists/*

RUN docker-php-source extract \
    && docker-php-ext-install mysql mysqli pdo pdo_mysql \
    && docker-php-source delete

RUN cd /var/www/html/ && git clone https://github.com/qunfengdong/mGSV.git

# Move the folder 'mgsv' to DocumentRoot of Apache web server. By default, the DocumentRoot of Apache is /var/www/ (speak to the system administrator to know the exact DocumentRoot).
RUN cd /var/www/html/mGSV \
    && mkdir tmp \
    && chmod -R 777 tmp

RUN cd /var/www/html/mGSV && sed -i.bak "s|'gsv'|'mgsv_user'|" lib/settings.php \ 
    && sed -i.bak "s|$database_pass = ''|$database_pass = 'mgsvpass'|" lib/settings.php \
    && sed -i.bak "s|cas-qshare.cas.unt.edu|localhost|" lib/settings.php

RUN cp /var/www/html/mGSV/Arial.ttf /usr/share/fonts/truetype/

RUN cd /var/www/html/mGSV/ws \
    && tar -xzf mgsv-ws-server.tar.gz

RUN cd /var/www/html/mGSV/ws/mgsv-ws-server \ 
    && mvn package

RUN cp -f /var/www/html/mGSV/ws/mgsv-ws-server/target/ws-server-1.0RC1-jar-with-dependencies.jar /var/www/html/mGSV/ws/

RUN cd /var/www/html/mGSV/ws \ 
    && echo "mgsv_upload_url=http://localhost/mgsv" > config.properties \
    && echo "ws_publish_url=http\://localhost\:8081/MGSVService" >> config.properties \
    && java -jar ws-server-1.0RC1-jar-with-dependencies.jar &

COPY ./index.php /var/www/html/
RUN a2enmod rewrite

Ao usar http://localhost:8080/ , esta é a saída que recebi:

Hello World!
Warning: mysqli_connect(): (HY000/2002): No such file or directory in /var/www/html/index.php on line 4
Failed to connect to MySQL: No such file or directory

O que eu senti falta?

Obrigado antecipadamente.

    
por user3523406 23.03.2018 / 02:27

1 resposta

2

Acredito que o problema aqui é que localhost não é o host do seu banco de dados. Se esse script PHP estiver sendo executado no contêiner docker "www", localhost provavelmente não terá um servidor MySQL de escuta. IIRC, o erro "arquivo não encontrado" do mysqli é devido a não encontrar o soquete do MySQL em localhost . Eu também não vejo que você está expondo quaisquer portas para a imagem "db", por isso não tenho certeza como "www" deve se conectar a um banco de dados em execução dentro dele.

Você gostaria de descobrir qual é o endereço do contêiner docker "db" e em qual porta ele está escutando. Em seguida, faça referência a isso em sua função mysqli_connect() . Um método mais fácil, se você tiver uma versão recente do docker, seria adicionar seus contêineres à mesma rede do Docker e referenciá-los pelo nome.

EDIT: rede do Docker

Você deve ler o recurso de na documentação oficial , pois é muito útil. Você provavelmente pode usar o seguinte docker-compose.yml (não testado):

version: '3.1'

services:
  db:
    image: mysql
    restart: always
    environment:
      - MYSQL_DATABASE=mgsv
      - MYSQL_USER=mgsv_user
      - MYSQL_PASSWORD=mgsvpass
      - MYSQL_ROOT_PASSWORD=mysql123
    volumes:
      - ./mysql:/docker-entrypoint-initdb.d
    networks:
      - web-db-net

  www:
    build: ./mGSV 
    restart: always
    ports:
      - 8080:80
    networks:
      - web-db-net

networks:
    web-db-net:

Em seguida, altere sua linha de conexão para se referir ao contêiner db pelo nome (você também precisaria especificar a porta se não estiver usando o padrão do MySQL, 3306):

$con = mysqli_connect("db","mgsv_user","mgsvpass","mgsv");

EDIT2: docker-compose.yml fixo para que as redes realmente funcionem

    
por 23.03.2018 / 04:59