Doberman
Doberman

Reputation: 147

Why mysql backup is not restored into my docker container ?

I want to dockerize mysql database. I have .sh script for preparing environment, creating database, user and other things. Mysql dump restore command not working in my .sh script, but working good if i open container shell and exec command in it. I want working command in my .sh script.

Whats wrong in my script ?

Dockerfile:

FROM alpine:latest

WORKDIR /app
COPY startup.sh /startup.sh

COPY backup.sql /app/

RUN apk add --update mysql mysql-client && rm -f /var/cache/apk/*
COPY my.cnf /etc/mysql/my.cnf

EXPOSE 3306

startup.sh :

#!/bin/sh

if [ -d /app/mysql ]; then
  echo "[i] MySQL directory already present, skipping creation"
else
  echo "[i] MySQL data directory not found, creating initial DBs"

  mysql_install_db --user=root > /dev/null

  if [ "$MYSQL_ROOT_PASSWORD" = "" ]; then
    MYSQL_ROOT_PASSWORD=111111
    echo "[i] MySQL root Password: $MYSQL_ROOT_PASSWORD"
  fi

  MYSQL_DATABASE=myDb

  if [ ! -d "/run/mysqld" ]; then
    mkdir -p /run/mysqld
  fi

  tfile=`mktemp`
  if [ ! -f "$tfile" ]; then
      return 1
  fi

  cat << EOF > $tfile
EOF

  if [ "$MYSQL_DATABASE" != "" ]; then
    echo "[i] Creating database: $MYSQL_DATABASE"
    echo "FLUSH PRIVILEGES;" >> $tfile
    echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile
    echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;"

    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile
    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';"

    echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile
    echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';"

    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" >> $tfile
    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;"

    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" >> $tfile
    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;"


    echo "FLUSH PRIVILEGES;" >> $tfile
  fi

  /usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile
  rm -f $tfile
fi



exec /usr/bin/mysqld --user=root --console

mysql -u root myDb < backup.sql # THIS LINE NOT WORKING! WHY ?

Upvotes: 4

Views: 391

Answers (2)

frekele
frekele

Reputation: 654

Try the helicopterizer for Backup and Restore for Docker Container.

https://github.com/frekele/helicopterizer

.

Upvotes: 0

ThatsNinja
ThatsNinja

Reputation: 422

You're not actually executing your script when the container starts. I'm not certain what you're trying to accomplish with this, and I'm not supposed to ask for clarification, so I'll just answer as best I can and hope this helps.

Try something like:

Dockerfile

FROM alpine:latest

WORKDIR /app
COPY startup.sh /startup.sh

COPY backup.sql /app/

RUN apk add --update mysql mysql-client && rm -f /var/cache/apk/*
COPY my.cnf /etc/mysql/my.cnf 

EXPOSE 3306

ENTRYPOINT ["/startup.sh"]
CMD /bin/bash -c "/usr/bin/mysqld --user=root --console && mysql -u root myDb < backup.sql"

Then, you'd modify your startup script like this:

startup.sh

#!/bin/sh

if [ -d /app/mysql ]; then
  echo "[i] MySQL directory already present, skipping creation"
else
  echo "[i] MySQL data directory not found, creating initial DBs"

  mysql_install_db --user=root > /dev/null

  if [ "$MYSQL_ROOT_PASSWORD" = "" ]; then
    MYSQL_ROOT_PASSWORD=111111
    echo "[i] MySQL root Password: $MYSQL_ROOT_PASSWORD"
  fi

  MYSQL_DATABASE=myDb

  if [ ! -d "/run/mysqld" ]; then
    mkdir -p /run/mysqld
  fi

  tfile=`mktemp`
  if [ ! -f "$tfile" ]; then
      return 1
  fi

  cat << EOF > $tfile
EOF

  if [ "$MYSQL_DATABASE" != "" ]; then
    echo "[i] Creating database: $MYSQL_DATABASE"
    echo "FLUSH PRIVILEGES;" >> $tfile
    echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile
    echo "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;"

    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile
    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';"

    echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';" >> $tfile
    echo "CREATE USER 'myuser'@'%' IDENTIFIED BY '2E7A80BFD6Cwdct5q4i1r9l3';"

    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;" >> $tfile
    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'localhost' WITH GRANT OPTION;"

    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;" >> $tfile
    echo "GRANT ALL PRIVILEGES ON * . * TO 'myuser'@'%' WITH GRANT OPTION;"


    echo "FLUSH PRIVILEGES;" >> $tfile
  fi

  /usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile
  rm -f $tfile
fi

exec "$@"

Take a look at the way the Dockerfile and docker-entrypoint.sh are set up in the official mysql Docker image repo.

Upvotes: 1

Related Questions