Dockerfile, сделать несколько команд (CMD), но ждать запроса БД? - PullRequest
1 голос
/ 28 июня 2019

Итак, я делаю dockerfile и хочу, чтобы он создал проект и импортировал базу данных после этого. Я использую XAMPP и включенный MariaDB. Я знаю, что мне нужно использовать CMD для импорта, так как XAMPP должен быть запущен. Я пытаюсь импортировать БД, запустив сценарий sql, который выполняет работу в приглашении БД.

Я пытался использовать && и; для объединения команд в одну строку, но это не сработает, так как он пытается выполнить все команды в терминале, прежде чем ждать запроса MariaDB. Есть идеи?

Это мой файл Docker, а последняя строка - моя попытка импортировать базу данных:

FROM cswl/xampp

COPY . /opt/lampp/htdocs/

WORKDIR /opt/lampp/htdocs/

RUN curl -sS https://getcomposer.org/installer | /opt/lampp/bin/php &&\
  /opt/lampp/bin/php composer.phar install

RUN curl https://s3.amazonaws.com/careers-picpay/lista_relevancia_1.txt --output db/lista_relevancia_1.txt &&\
  curl http://s3.amazonaws.com/careers-picpay/lista_relevancia_2.txt --output db/lista_relevancia_2.txt &&\
  curl https://s3.amazonaws.com/careers-picpay/users.csv.gz --output db/users.csv.gz

RUN gzip -d db/users.csv.gz

CMD /opt/lampp/bin/mysql -u root && source ./initdb.sql

UPDATE: Поэтому я также попытался заменить две мои команды на одну с опцией MariaDB -e для выполнения строки после входа в систему ... Не работает, база данных не создана, и я не знаю почему. Это команда:

CMD /opt/lampp/bin/mysql -u root -e "source ./initdb.sql"

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Отредактировано

С официальным изображением MariaDB нужно просто скопировать скрипт инициализации (initdb.sql) в каталог /docker-entrypoint-initdb.d.См. Краткое руководство по MariaDB Docker .Файлы в этом каталоге выполняются в алфавитном порядке при создании и инициализации контейнера.

С образом XAMPP кажется, что вы должны сделать это вручную.Это определенно не элегантное решение, но оно должно работать.

Замените ENTRYPOINT скрипт изображения на этот:

#!/bin/bash

/opt/lampp/lampp start

# wait for mysql to be ready
while ! /opt/lampp/bin//mysql --protocol TCP  -e "show databases;"; do sleep 2; done

# initialize the database
/opt/lampp/bin/mysql -u root -e "source /init.sql"

## Run tail so we don't exit
/usr/bin/tail -f /opt/lampp/logs/php_error_log

Это будет ждать, пока mysql будет готовперед выполнением команды source.

Добавьте к Dockerfile следующее, чтобы скопировать сценарий инициализации sql и переопределить ENTRYPOINT:

FROM cswl/xampp
...

COPY init.sql /init.sql

COPY init.sh /init.sh
RUN chmod +x /init.sh

ENTRYPOINT  ["/init.sh"]
1 голос
/ 28 июня 2019

вы можете использовать wait-for-it.sh , чтобы проверить, работает ли БД, добавив его в CMD:

CMD ["path/to/wait-for-it.sh", "localhost:3306", "-t", "6000", "--", "YOUR ACTUAL COMMAND"]

Вы можете сначала скопировать скрипт в свой контейнер.

здесь подробнее

...