Как запустить sql скрипты для контейнера mariaDB docker - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь создать экземпляр mariadb в docker, а затем запустить все файлы в каталоге с ним. Я знаю, что мой скрипт работает, когда я выполняю его после запуска моего файла dockerfile, но когда я помещаю скрипт в файл docker, он сообщает, что mariadb получил ошибку 127. Я попытался поместить вызов mysqld внутри скрипта, но это не устранило проблему.
Dockerfile


ENV MYSQL_ROOT_PASSWORD test
ENV MYSQL_DATABASE mydatabase

COPY . /usr/src
WORKDIR /usr/src
RUN script_runner.sh test 
EXPOSE 3306

CMD ["mysqld"]

script_runner. sh

files=`ls start_script | grep ^'do'`
for script in $files
do
mysql -u root --password=$1 < `pwd`/start_script/$script
done

docker -compose.yml

...
mariadb:
        build:
            context: ./mariaDB
        restart: always
        ports:
            - "3306:3306"
        volumes:
            - "/var/lib/mysql:/var/lib/mysql"
            - "/srv/docker/sockets/mariadb.container.sock:/var/run/mysqld/mysqld"

файловая система

-repo/
--docker-compose.yml
--mariadb/
---Dockerfile
---script_runner.sh
----start_script/
----do-release.sql

ошибка

Building mariadb
Step 1/8 : FROM mariadb:10.4.11-bionic
 ---> bc20d5f8d0fe
Step 2/8 : ENV MYSQL_ROOT_PASSWORD test
 ---> Running in 5987d662632b
Removing intermediate container 5987d662632b
 ---> e40256430e39
Step 3/8 : ENV MYSQL_DATABASE mydatabase
 ---> Running in a865ef21cdcc
Removing intermediate container a865ef21cdcc
 ---> dc5997996fef
Step 4/8 : COPY . /usr/src
 ---> 5314d67545bb
Step 5/8 : WORKDIR /usr/src
 ---> Running in 4643fe58e44e
Removing intermediate container 4643fe58e44e
 ---> 88e7901d501a
Step 6/8 : RUN script_runner.sh test
 ---> Running in 502ab4fddbb8
/bin/sh: 1: script_runner.sh: not found
ERROR: Service 'mariadb' failed to build: The command '/bin/sh -c script_runner.sh test' returned a non-zero code: 127

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я согласен с комментарием, в котором говорится, что вам нужно сделать скрипт script_runner. sh исполняемым скриптом, что, вероятно, стало причиной кода возврата 127. Тем не менее, я думаю, вы обнаружите, что он все равно не будет работать даже после того, как вы сделаете его исполняемым.

В момент выполнения RUN script_runner.sh test сервер MySQL фактически не будет работать внутри Docker контейнер во время процесса сборки. Поэтому, если вы сделали сценарий исполняемым, я думаю, вы увидите, что он вернет ошибку типа «не удается подключиться к mysql sock». Вы должны запустить mysqld как часть вашей Docker сборки. Также помните, что сборка docker будет выполнять каждый оператор RUN самостоятельно и вносить изменения в слой диска после завершения этой команды. Если вы просто попытаетесь выдать RUN mysqld (или аналогичный), либо процесс mysqld запустится и навсегда заблокируется (при условии, что он не демонизируется), либо (если вы скажете ему демонизировать), он запустится и, как только он переместится на заднем плане docker создаст слой диска и затем выполнит ваш script_runner.sh, но mysql завершится.

Если вы хотите сделать это, у вас есть два варианта:

  1. Объедините два в один оператор RUN, такой как RUN mysqld_safe && script_runner.sh
  2. Ваш скрипт_runner. sh Запустите mysqld, прежде чем он попытается выполнить mysql клиента.

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

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#minimize -the-количество-слоев

0 голосов
/ 29 января 2020

Вашему файлу script_runner.sh необходимы разрешения на выполнение, иначе он не будет найден как исполняемый файл. Попробуйте установить атрибут в локальной папке (chmod 7xx) или в Dockerfile

COPY . /usr/src
WORKDIR /usr/src
RUN chmod 711 script_runner.sh
RUN script_runner.sh test 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...