À l'aide de Docker j'obtiens l'erreur: SQLSTATE[HY000] [2002] No such file or directory”
Je suis en utilisant le Panneau de créer un conteneur pour tester mon application web construit sur PHP et MySQL sur mon Mac. Mon PHP app est construit à l'aide de la Graisse Sans Cadre pour MVC et de routage. J'ai deux Dockerfiles, un pour MySQL et un pour PHP. J'ai utilisé de test Docker applications avec succès, alors je crois que mes images sont correctement installés.
La partie principale de l'erreur:
Internal Server Error
SQLSTATE[HY000] [2002] No such file or directory
[fatfree/lib/DB/SQL.php:466] PDO->__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password',array(1002=>'SET NAMES utf8;'))
[fatfree/app/Controllers/Controller.php:24] DB\SQL->__construct('mysql:host=127.0.0.1;port=3306;dbname=robohome','root','password')
Remarque, si je le connecte à l'aide de 127.0.0.1
au lieu de localhost
- je obtenir un peu différente d'erreur qui dit: SQLSTATE[HY000] [2002] Connection refused
Mon PHP Dockerfile:
FROM php:5.6-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN a2enmod rewrite
Mon MySQL Dockerfile:
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD password
ENV MYSQL_DATABASE robohome
COPY ./schema.sql /docker-entrypoint-initdb.d/
Mon Controller.php
fichier dans lequel l'erreur mentionne ligne 24:
<?php
namespace Controllers;
class Controller
{
protected $f3;
protected $db;
public function __construct()
{
$f3 = \Base::instance();
$this->f3 = $f3;
$mysqlServerName = $f3->get("MYSQL_SERVERNAME");
$mysqlDatabseName = $f3->get("MYSQL_DBNAME");
//$container = \DI\ContainerBuilder::buildDevContainer(); <-Not used currently
//Below is line 24 referred to in the error
$db = new \DB\SQL(
"mysql:host={$mysqlServerName};port=3306;dbname={$mysqlDatabseName}",
$f3->get("MYSQL_USERNAME"),
$f3->get("MYSQL_PASSWORD")
);
$this->db = $db;
}
Ceux MYSQL_*
valeurs sont extraites d'un .ini
fichier:
MYSQL_SERVERNAME = "localhost" <-This is what I've tried changing to 127.0.0.1
MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "password"
MYSQL_DBNAME = "robohome"
Mon menu fixe composer fichier:
version: '2'
services:
web:
build: ./docker/php
ports:
- 80:80
volumes:
- .:/var/www/html/
links:
- db
db:
build: ./docker/mysql
ports:
- 3306
Je l'exécute en faisant docker-compose up --build -d
. La sortie alors je peux obtenir à partir de docker ps
est:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f35066a16586 robohomeweb_mysql "docker-entrypoint.sh" 3 minutes ago Up 2 seconds 0.0.0.0:32777->3306/tcp robohomeweb_mysql_1
86d34eb34583 robohomeweb_php "apache2-foreground" 3 minutes ago Up 2 seconds 0.0.0.0:80->80/tcp robohomeweb_php_1
Si je suis à court de premier plan au lieu de cela, j'obtiens le résultat suivant:
Building php
Step 1 : FROM php:5.6-apache
---> 8f9b7e57129a
Step 2 : RUN docker-php-ext-install mysqli pdo pdo_mysql
---> Using cache
---> fadd8f9e7207
Step 3 : RUN a2enmod rewrite
---> Using cache
---> 9dfed7fdc60f
Successfully built 9dfed7fdc60f
Building mysql
Step 1 : FROM mysql:5.7
---> eda6a4884645
Step 2 : ENV MYSQL_ROOT_PASSWORD password
---> Using cache
---> 759895ac5772
Step 3 : ENV MYSQL_DATABASE robohome
---> Using cache
---> e926c5ecc088
Step 4 : COPY ./schema.sql /docker-entrypoint-initdb.d/
---> Using cache
---> cf5d00aa8020
Successfully built cf5d00aa8020
Starting robohomeweb_php_1
Starting robohomeweb_mysql_1
Attaching to robohomeweb_mysql_1, robohomeweb_php_1
php_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
php_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
php_1 | [Sun Oct 16 20:21:17.944575 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.26 configured -- resuming normal operations
php_1 | [Sun Oct 16 20:21:17.946919 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
mysql_1 | 2016-10-16T20:21:18.036272Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
mysql_1 | 2016-10-16T20:21:18.038330Z 0 [Note] mysqld (mysqld 5.7.16) starting as process 1 ...
mysql_1 | 2016-10-16T20:21:18.043331Z 0 [Note] InnoDB: PUNCH HOLE support available
mysql_1 | 2016-10-16T20:21:18.043603Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysql_1 | 2016-10-16T20:21:18.043951Z 0 [Note] InnoDB: Uses event mutexes
mysql_1 | 2016-10-16T20:21:18.044077Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
mysql_1 | 2016-10-16T20:21:18.044260Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
mysql_1 | 2016-10-16T20:21:18.044414Z 0 [Note] InnoDB: Using Linux native AIO
mysql_1 | 2016-10-16T20:21:18.045150Z 0 [Note] InnoDB: Number of pools: 1
mysql_1 | 2016-10-16T20:21:18.045620Z 0 [Note] InnoDB: Using CPU crc32 instructions
mysql_1 | 2016-10-16T20:21:18.047629Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
mysql_1 | 2016-10-16T20:21:18.057705Z 0 [Note] InnoDB: Completed initialization of buffer pool
mysql_1 | 2016-10-16T20:21:18.059988Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
mysql_1 | 2016-10-16T20:21:18.074670Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
mysql_1 | 2016-10-16T20:21:18.101209Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
mysql_1 | 2016-10-16T20:21:18.101433Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
mysql_1 | 2016-10-16T20:21:18.354806Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
mysql_1 | 2016-10-16T20:21:18.356928Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
mysql_1 | 2016-10-16T20:21:18.357158Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
mysql_1 | 2016-10-16T20:21:18.358049Z 0 [Note] InnoDB: Waiting for purge to start
mysql_1 | 2016-10-16T20:21:18.412987Z 0 [Note] InnoDB: 5.7.16 started; log sequence number 12179647
mysql_1 | 2016-10-16T20:21:18.414470Z 0 [Note] Plugin 'FEDERATED' is disabled.
mysql_1 | 2016-10-16T20:21:18.421833Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
mysql_1 | 2016-10-16T20:21:18.424144Z 0 [Note] InnoDB: Buffer pool(s) load completed at 161016 20:21:18
mysql_1 | 2016-10-16T20:21:18.425607Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
mysql_1 | 2016-10-16T20:21:18.427018Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
mysql_1 | 2016-10-16T20:21:18.427581Z 0 [Note] IPv6 is available.
mysql_1 | 2016-10-16T20:21:18.427749Z 0 [Note] - '::' resolves to '::';
mysql_1 | 2016-10-16T20:21:18.428019Z 0 [Note] Server socket created on IP: '::'.
mysql_1 | 2016-10-16T20:21:18.456023Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
mysql_1 | 2016-10-16T20:21:18.456354Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
mysql_1 | 2016-10-16T20:21:18.480237Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
mysql_1 | 2016-10-16T20:21:18.488758Z 0 [Note] Event Scheduler: Loaded 0 events
mysql_1 | 2016-10-16T20:21:18.490880Z 0 [Note] mysqld: ready for connections.
mysql_1 | Version: '5.7.16' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
De mes recherches, j'ai essayé de connecter à l'aide de deux localhost
et 127.0.0.1
depuis qu'ils sont techniquement de les traiter différemment. Il pourrait aussi être quelque chose lié à essayer de parler via des sockets à la place de TCP. Idéalement, je voudrais une solution que je peux cuire dans mon Dockerfiles donc je n'ai pas à vous soucier de se souvenir des commandes ou comment j'ai fait quelque chose.
Basé sur mon commentaire ci-dessus (vous avez faites défiler vers la droite pour le voir)
0.0.0.0:32777->3306/tcp
Modifié pour inclure de mon menu fixe composer de fichier.
OriginalL'auteur roundtheworld | 2016-10-16
Vous devez vous connecter pour publier un commentaire.
Comme quelqu'un l'a souligné dans les commentaires, le docker-composition de fichier que vous avez fourni est très pertinentes à votre question.
La documentation pour
liens
dans docker-composer les fichiers ditDans votre cas, le conteneur de base de données est nommé
db
, afin que la résolutiondb
hôte de la PHP contenant ne doit point vous à la base de données MySQL contenant. Remplacement delocalhost
avecdb
dans votre fichier de configuration devrait permettre à l'PHP conteneur pour se connecter à MySQL.Je voulais aussi ajouter que je n'ai pas besoin
links
section. Mon problème était de 100%, qui fait que l'emplacement de la base de données dans mon fichier de config a étélocalhost
quand il aurait dû être le nom de mon service dans mon fichier ymldb
.C'est vrai, (assez) récemment, Docker a obtenu le soutien de base DNS qui permet de conteneurs à trouver les uns les autres par leur nom.
Homme, pas de mots.... Merci!
le changement "dsn' => 'mysql:host=localhost;dbname=yourdb', 'dsn' => 'mysql:host=db;dbname=yourdb',
OriginalL'auteur R0MANARMY
php vit sur un autre panneau de l'image que mysql. donc localhost et 127.0.0.1 à partir de php ne pointent pas vers mysql. vous devez vous connecter à l'adresse ip de la base de données mysql docker instance.
assurez-vous également que mysql est à l'écoute sur toutes les interfaces. Dans mysql.ini vous devez mettre listen 0.0.0.0 à écouter sur toutes les interfaces disponibles. Par défaut, il n'autoriser que les connexions à partir de localhost (et le php conteneur docker est un hôte différent).
Je comprends que php et mysql vivent dans des images Docker, mais pour l'exemple que j'ai trouvé en ligne, que j'ai construit, je n'ai rien vu qui l'a fait. J'ai été en mesure d'obtenir cet exemple à un travail qui est très similaire à la mienne: github.com/mikesir87/docker-compose-demo
J'ai mis à jour la réponse. Reliant les conteneurs ensemble, c'est ce que vous voulez, puis de référence par le nom du lien.
Aussi le docker-composition de fichier est plus pertinent pour votre question que presque tout le reste fourni 😉 Mais, qui est l'endroit où vous voulez tourner vers le haut et le lien 'em.
Ouais, j'ai seulement joué avec menu fixe pour environ une semaine, donc je suis assez inexpérimenté. Si j'ai bien compris votre commentaire avec correctement dans mon
.yml
fichier que j'ai ajoutélinks: - mysql
à la fin et ça ne fonctionne pas. J'ai essayé de relier le php, le mysql ainsi, même résultat. Je ne pense pas qu'il était nécessaire de lier le tout .yml fichiers.OriginalL'auteur edlerd