skip to Main Content

HY i have a docker container on the setup i get a error that the system is unable to connect to the database i cant figure it out how this comes.

i tried connecting to localhost, 127.0.0.1 and mysql but i get the same error:

CakePHP is NOT able to connect to the database.
Connection to Mysql could not be established: SQLSTATE[HY000] [2002] No such file or directory

cant seem to find anything in the log files (apache and cake), what am i missing ?

php code:

 'default' => [
            //'className' =>'CakeDatabaseConnection',
            'className' => Connection::class,
            'driver' => Mysql::class,
            //'driver' => 'CakeDatabaseDriverMysql',
            'persistent' => false,
            'timezone' => 'UTC',
            'encoding' => 'utf8',
            'host' => 'mysql',
            'username' => 'myusername',
            'password' => 'mypassword',
            'database' => 'myadatabase',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
            'quoteIdentifiers' => false,
        ],

docker-compose.yml

#File version 2.1
version: "3"


services:
  webserver:
    build: 
      context: ./bin/webserver
    container_name: '7.3.x-webserver'
    restart: 'always'
    ports:
      - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
      - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    links:
      - mysql
    volumes: 
      - ${DOCUMENT_ROOT-./www}:/var/www/html
      - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
      - ${LOG_DIR-./logs/apache2}:/var/log/apache2
  mysql:
    build:
      context: "./bin/${DATABASE}"
    container_name: '5.7-mysql'
    restart: 'always'
    ports:
      - "${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes: 
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: 'sc-phpmyadmin'
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_USER: ${MYSQL_USER}
      PMA_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - '8080:80'
    volumes: 
      - /sessions
#  redis:
#    container_name: 'sc-redis'
#    image: redis:latest
#    ports:
#      - "${HOST_MACHINE_REDIS_PORT}:6379"

docker build script:

FROM php:7.3-apache-stretch

# suppression of debconfig  complaints of  install apt packages interactively 
ARG DEBIAN_FRONTEND=noninteractive

# Update
RUN apt-get -y update --fix-missing && 
    apt-get upgrade -y && 
    apt-get --no-install-recommends install -y apt-utils && 
    rm -rf /var/lib/apt/lists/*


# Install useful tools and install important libaries
RUN apt-get -y update && 
    apt-get -y --no-install-recommends install nano wget dialog libsqlite3-dev libsqlite3-0 && 
    apt-get -y --no-install-recommends install mysql-client zlib1g-dev libzip-dev libicu-dev && 
    apt-get -y --no-install-recommends install --fix-missing apt-utils build-essential git curl &&  
    apt-get -y --no-install-recommends install --fix-missing libcurl3 libcurl3-dev zip openssl && 
    rm -rf /var/lib/apt/lists/* && 
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install xdebug
RUN pecl install xdebug-2.7.2 && 
    docker-php-ext-enable xdebug

# Install redis
RUN pecl install redis-5.0.2 && 
    docker-php-ext-enable redis

# Other PHP7 Extensions

RUN docker-php-ext-install pdo_mysql && 
    docker-php-ext-install pdo_sqlite && 
    docker-php-ext-install mysqli && 
    docker-php-ext-install curl && 
    docker-php-ext-install tokenizer && 
    docker-php-ext-install json && 
    docker-php-ext-install zip && 
    docker-php-ext-install -j$(nproc) intl && 
    docker-php-ext-install mbstring && 
    docker-php-ext-install gettext

# Install Freetype 
RUN apt-get -y update && 
    apt-get --no-install-recommends install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && 
    rm -rf /var/lib/apt/lists/* && 
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && 
    docker-php-ext-install -j$(nproc) gd

# Enable apache modules
RUN a2enmod rewrite headers

# Cleanup
RUN rm -rf /usr/src/*

2

Answers


  1. Chosen as BEST ANSWER

    hy i changed the app.php with the env variables changed the username and password of the database.

    i removed the data of ./data/mysql rebuild the container but still the same error my gues it hase something to to with the hostname

    tried also with the variable PMA_HOST but still no go. (localhost does not work either)

     'host' => env('PMA_HOST'),
    

    if i login in to phpmyadmin i can create my tables without any problem.

    if i login in to the container i can loging and do also the querys

    i saw that the socket was not filled in by grepping the php settings,

    pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

    now this is filled in but still a no go on php connection to mysql (on cake, in my test script for a database i have connection).


  2. When the connection between the host and the containerized Docker database needs to be established, you need to use your host’s loopback IP address (127.0.0.1) and in your case this would look like following:

    ...
    'host' => '127.0.0.1',
    'port' => HOST_MACHINE_MYSQL_PORT
    'username' => DOCKER_MYSQL_USERNAME,
    'password' => DOCKER_MYSQL_PASSWORD,
    'database' => DOCKER_MYSQL_DATABASE_NAME
    ...
    

    HOST_MACHINE_MYSQL_PORT is the port on host machine where DB service is point to from the Docker container.

    The connection should be established as expected as you are connecting to the port exposed by the MySQL server running inside Docker container.


    Quick note on localhost vs 127.0.0.1:

    A localhost is the standard hostname given to the machine itself that usually resolves and maps to 127.0.0.1 address.

    127.0.0.1 address is the address of the machine itself used to establish an IP connection to the same machine or computer being used by the end-user.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search