Docker, ссылающийся на другой контейнер. Вызов mysqldump с помощью команды php

#php #mysql #symfony #docker #docker-compose

#php #mysql #symfony #docker #docker-compose

Вопрос:

У меня есть пакет резервного копирования базы данных (https://github.com/dizda/CloudBackupBundle ) установлен в проекте Symfony3 с использованием Docker, но я не могу заставить его работать из-за того, что он либо не находит PHP, либо не находит MySQL

Когда я запускаю php app/console --env=prod dizda:backup:start через exec, run или через cron. Я получаю ошибку mysqldump command not found через изображение PHP или ошибку PHP not found из изображения Mysql / db.

Как мне запустить команду php, которая затем запускает команду mysqldump.

Мой файл docker-compose выглядит следующим образом:

 version: '2'
services:
    web:
        # image: nginx:latest
        build: .
        restart: always
        ports:
            - "80:80"
        volumes:
            - .:/usr/share/nginx/html
        links:
            - php
            - db
            - node
        volumes_from:
            - php
        volumes:
            - ./logs/nginx/:/var/log/nginx
    php:
        # image: php:fpm
        restart: always
        build: ./docker_setup/php
        links:
            - redis
        expose:
            - 9000
        volumes:
            - .:/usr/share/nginx/html
    db:
        image: mysql:5.7
        volumes:
          - "/var/lib/mysql"
        restart: always
        ports:
            - 8001:3306
        environment:
          MYSQL_ROOT_PASSWORD: gfxhae671
          MYSQL_DATABASE: boxstat_db_live
          MYSQL_USER: boxstat_live
          MYSQL_PASSWORD: GfXhAe^7!
    node:
        # image: //digitallyseamless/nodejs-bower-grunt:5
        build: ./docker_setup/node
        volumes_from:
            - php
    redis:
        image: redis:latest
 

Я довольно новичок в docker, поэтому и простые улучшения, которые вы можете увидеть, не стесняйтесь отмечать…Я на стадии проб и ошибок!

Ответ №1:

Ваше изображение, содержащее ваш код, должно иметь все зависимости, необходимые для запуска вашего кода.

В этом случае для запуска вашего кода необходимо, чтобы mysqldump был установлен локально. Я бы счел это зависимостью от вашего кода.

Возможно, имеет смысл добавить в ваш Dockerfile строку запуска, которая установит команду mysqldump, чтобы ваш код мог ее использовать.

Другим подходом в целом было бы экстернализировать процесс резервного копирования базы данных вместо того, чтобы оставлять это на усмотрение вашего приложения. У вас может быть какой-нибудь контейнер, который работает на cron и выполняет процесс mysqldump таким образом.

Я бы счел оба подхода чистыми.

Комментарии:

1. однако в моем образе БД уже установлен mysqldump, не могу ли я как-то использовать это или мне нужно установить его снова?

2. контейнеры по своей конструкции обеспечивают изоляцию друг от друга. Вы определенно хотите, чтобы в вашем образе было установлено все необходимое, несмотря на то, что в других контейнерах / изображениях это также есть.

3. И если он установит дамп mysql в контейнер php, возможно ли создать дамп mysql из удаленной базы данных?

4. да. mysqldump — это просто клиент mysql и может подключаться к удаленной базе данных.