Newsgroup: it.comp.www.php
Titolo: mysql all'interno di docker

++++ cat docker-compose.yml
version: '3.3'
services:
   app:
     build:
       context: .
       dockerfile: docker/Dockerfile
     image: laravel-docker
     ports:
       - 4000:80
     volumes:
       - ./src:/var/www/html
     links:
       - mysql
       - redis
     environment:
       DB_HOST: mysql
       DB_DATABASE: test
       DB_USERNAME: root
       DB_PASSWORD: root
       REDIS_HOST: redis
       SESSION_DRIVER: redis
       CACHE_DRIVER: redis
   mysql:
     image: mysql:5.7
     ports:
       - 13306:3306
     environment:
       MYSQL_DATABASE: test
       MYSQL_USER: root
       MYSQL_PASSWORD: root
       MYSQL_ROOT_PASSWORD: root
     volumes:
         - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
   redis:
     image: redis:4.0-alpine
     ports:
       - 16379:6379
 
++++ cat docker/Dockerfile
FROM php:7.2.2-apache
RUN docker-php-ext-install mbstring pdo pdo_mysql
 
++++ cat src/index.php
<?php
error_reporting(255);
 
$pdo = new PDO(
     'mysql:dbname=test;host=mysql',
     'root',
     'root'
);
 
++++ docker-compose up -d --build
Building app
 
++++ curl 
http://localhost:4000
 
<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY000] [2002] 
Connection refused in /var/www/html/index.php:7
 
Perchè?

 Perchè?
 
Perché!
 
 
Ah, con la config che hai usato il DB rimane dentro al container e viene 
distrutto con lui.
 
Questa è la config che uso io:
 
   mysql:
     image: mysql:latest
     ports:
       - "3306:3306"
     volumes:
       - ${LOCALPATH}/data/mysql:/var/lib/mysql:cached
     environment:
       - "MYSQL_ROOT_PASSWORD=supersecretpassword"
     command: |
       mysqld --datadir=/var/lib/mysql --user=mysql --server-id=1 
--log-bin=/var/log/mysql/mysql-bin.log
 
Bye.

 Bye.
 
+ cat docker-compose.yml
version: '3.3'
services:
   app:
     build:
       context: .
       dockerfile: docker/Dockerfile
     image: laravel-docker
     ports:
       - 4000:80
     volumes:
       - ./src:/var/www/html
     links:
       - mysql
       - redis
     environment:
       DB_HOST: mysql
       DB_DATABASE: test
       DB_USERNAME: root
       DB_PASSWORD: root
       REDIS_HOST: redis
       SESSION_DRIVER: redis
       CACHE_DRIVER: redis
   mysql:
     image: mysql:latest
     ports:
       - 3306:3306
     environment:
       MYSQL_DATABASE: test
       MYSQL_USER: root
       MYSQL_PASSWORD: root
       MYSQL_ROOT_PASSWORD: root
     volumes:
         - ${LOCALPATH}/dump.sql:/docker-entrypoint-initdb.d/dump.sql:cached
   redis:
     image: redis:4.0-alpine
     ports:
       - 16379:6379
     command:
       mysqld --datadir=/var/lib/mysql --user=mysql --server-id=1 
--log-bin=/var/log/mysql/mysql-bin.log
 
+ docker-compose up -d --build
WARNING: The LOCALPATH variable is not set. Defaulting to a blank string.
Creating network "dockermysql_default" with the default driver
Building app
Step 1/2 : FROM php:7.2.2-apache
  ---> 08685253e459
Step 2/2 : RUN docker-php-ext-install mbstring pdo pdo_mysql
  ---> Using cache
  ---> fdb2f4e67537
 
Successfully built fdb2f4e67537
Successfully tagged laravel-docker:latest
Creating dockermysql_mysql_1 ... error
Creating dockermysql_redis_1 ...
 
Creating dockermysql_redis_1 ... done
_mysql_1 
(2fc2fcfccee1beb12e9c9a73e20070a601cad0c52d1ad2a35d1b63f1be412b2d): 
Error starting userland proxy: listen tcp 
0.0.0.0:3306
: bind: address 
already in use
 
ERROR: for mysql  Cannot start service mysql: driver failed programming 
external connectivity on endpoint dockermysql_mysql_1 
(2fc2fcfccee1beb12e9c9a73e20070a601cad0c52d1ad2a35d1b63f1be412b2d): 
Error starting userland proxy: listen tcp 
0.0.0.0:3306
: bind: address 
already in use
ERROR: Encountered errors while bringing up the project.
rino@comex:~$

 already in use
 
Probabilmente hai già un MySQL che gira sulla macchina locale.
 
Ma mi sa che hai ragione e non era quello il problema, visto che nella 
rete "interna" dovrebbe comunque esporlo come 3306 anche se fai l'alias 
locale.
 
Bye.
 

 locale.
 
Ricominciamo da capo.
Voglio creare un immagine in cui gira apache, php, e mysql.
Innanzitutto
 
mkdir my-project
cd my-project
touch docker-compose.yml
 
Poi? (una cosa alla volta e con ordine)

 (nella shell normale, in pratica). Puoi usare $HOME per la tua home, ecc.
 
Per curiosità, perchè usi $LOCALPATH?
In quale file ha messo l'istruzione
 
export LOCALPATH=...
 
???

 export LOCALPATH=...
 
Uso direnv per tenere la config nella cartella del progetto e trovarmi 
le env-vars automaticamente inizializzate quando ci entro.
 
Bye.
 


$ echo export FOO=foo > .envrc
$ direnv allow .
$ echo ${FOO-nope}
nope
 
Non sembra funzionare :(