docker Не удалось проанализировать строку DSN с помощью CakePHP - PullRequest
0 голосов
/ 27 ноября 2018

Я настраиваю CakePHP приложение с Docker .

Я новичок в Docker , и это мой первый docker-compose .

Dockerfile

FROM php:7.2-apache
LABEL maintainer="Anuj Sharma <contact@anujsh.in>"

# Enable Apache Rewrite + Expires Module
RUN a2enmod rewrite expires

# Install dependencies
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libyaml-dev \
    zlib1g-dev \
    libicu-dev \
    libpq-dev \
    libmcrypt-dev \
    mysql-client \
    g++ \
    git \
    libzip-dev \
    zip \
    unzip \
    && rm -r /var/lib/apt/lists/* \
    && pecl install mcrypt-1.0.1 \
    && docker-php-ext-install opcache \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-configure zip --with-libzip \
    && docker-php-ext-install zip \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install mbstring pcntl pdo_mysql pdo_pgsql pgsql \
    && docker-php-ext-enable mcrypt \
    && docker-php-ext-enable intl

# Install composer
#RUN curl -sS https://getcomposer.org/installer | php -- --install -dir=/usr/bin/ --filename=composer
RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
        echo 'opcache.enable_cli=1'; \
        echo 'upload_max_filesize=128M'; \
        echo 'post_max_size=128M'; \
        echo 'extension=intl.so'; \
    } > /usr/local/etc/php/conf.d/php-recommended.ini


RUN pecl install apcu \
    && pecl install yaml \
    && docker-php-ext-enable apcu yaml

# Set our application folder as an environment variable
ENV APP_HOME /var/www/html

# Change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

# Change the web_root to cakephp /var/www/html/webroot folder
RUN sed -i -e "s/html/html\/webroot/g" /etc/apache2/sites-enabled/000-default.conf

# Copy source files and run composer
COPY . $APP_HOME

# Install all PHP dependencies
RUN composer install --no-interaction

# Change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME

ПРИМЕЧАНИЕ : я скопировал команды из разных источников для генерации выше Dockerfile .

docker-compose.yml

version: "3.1"

# Define all services
services:
  # Our service is called CakePHP ;-)
  cakephp:
    # We want to use the image which is build from our Dockerfile
    build: .
    # Apache is running on port 80 but we want to expose this to port 4000 on our local machine
    ports:
      - "4000:80"
    # We depending on the mysql backend
    depends_on:
      - mysql
    volumes:
      - .:/var/www/html/
    environment:
      - SECURITY_SALT=070q78he40qfw475q0q7v0wt7vfqw7vw87qw8dpowe7rfpwq437
      - DATABASE_URL=mysql
      - MYSQL_USERNAME=root
      - MYSQL_PASSWORD=root
      - MYSQL_DATABASE=cakephp

  mysql:
    # We use the mysql base image, version 5.7
    image: mysql:5.7
    # We mount a datavolume to make sure we don't loose data
    volumes:
      - cap_mysql_data:/var/lib/mysql
    # Setting some env vars to create the DB
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=cakephp

volumes:
  cap_mysql_data:

Когда я запускаю

docker-compose build

Все идет хорошо.Но когда я запускаю миграцию, миграции

docker-compose run cakephp bin/cake migrations migrate

выдает ошибку как

Exception: The DSN string 'mysql' could not be parsed. in [/var/www/html/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php, line 292]

Файл app.php CakePHP имеетконфигурация для источника данных

'username' => env('MYSQL_USERNAME', 'root'),
'password' => env('MYSQL_PASSWORD', ''),
'database' => env('MYSQL_DATABASE', 'cakephp'),
'url' => env('DATABASE_URL', null),

1 Ответ

0 голосов
/ 27 ноября 2018

Ожидается, что переменная окружения DATABASE_URL будет содержать строку DSN (имя источника данных), mysql не такая строка, вот как выглядит DSN:

mysql://user:pass@localhost:3306/database?encoding=utf8&timezone=UTC&cacheMetadata=true

части в основном следующие:

<driver>://<username>:<password>@<host>:<port>/<database>?<options>

Если вы на самом деле не хотите использовать DSN, не указывайте переменную DATABASE_URL.

См. также

...