雑木林

頭の中の整理と忘れないための確認メモ

raspberry pi用にmariadbのコンテナを作る

nextcloudをコンテナで作ろうとしたらmariadbが公式からpullできなかったので作ってみた。

$ docker pull mariadb
Using default tag: latest
latest: Pulling from library/mariadb
no matching manifest for linux/arm/v7 in the manifest list entries

環境


Dockerfileはこんな感じ。
環境変数は実行時に渡すのでそのままでいいです。

FROM alpine:latest

ENV DB_DATA_PATH="/var/lib/mysql" \
    DB_ROOT_PASS="mariadb_root_password" \
    DB_NAME="sampledb" \
    DB_USER="mariadb_user" \
    DB_PASS="mariadb_user_password"

RUN apk --no-cache update \
    && apk --no-cache add openrc mariadb mariadb-client tzdata \
    && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" > /etc/timezone \
    && apk del tzdata \
    && sed -i 's/#rc_sys=""/rc_sys="lxc"/g' /etc/rc.conf \
    && echo 'rc_provide="loopback net"' >> /etc/rc.conf \
    && sed -i 's/^#\(rc_logger="YES"\)$/\1/' /etc/rc.conf \
    && sed -i '/tty/d' /etc/inittab \
    && sed -i 's/hostname $opts/# hostname $opts/g' /etc/init.d/hostname \
    && sed -i 's/mount -t tmpfs/# mount -t tmpfs/g' /lib/rc/sh/init.sh \
    && sed -i 's/cgroup_add_service /# cgroup_add_service /g' /lib/rc/sh/openrc-run.sh \
    && rc-status \
    && touch /run/openrc/softlevel \
    && sed -i 's/^skip-networking/skip-networking = 0\nskip-bind-address\nskip-name-resolve\nport = 3306\ncharacter-set-server = utf8/g' /etc/my.cnf.d/mariadb-server.cnf

COPY entrypoint.sh /root/entrypoint.sh

ENTRYPOINT /bin/sh /root/entrypoint.sh
EXPOSE 3306

同じフォルダ内にentrypoint.shを格納してください。
システムテーブルが無ければ新規作成する処理を行っています。
コンテナを再度起動するとmysqld.sock周りでエラーが出たので、rc-service使って回避してます。

#!/bin/sh

if [ ! -d "${DB_DATA_PATH}/mysql" ]; then
    mysql_install_db --user=mysql --datadir=${DB_DATA_PATH}
    rc-service mariadb start
    mysqladmin -u root password "${DB_ROOT_PASS}"
    echo "CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8;"  >> /tmp/sql
    echo "grant all privileges on ${DB_NAME}.* to ${DB_USER}@'%' identified by '${DB_PASS}' with grant option ;" >> /tmp/sql
    echo "DELETE FROM mysql.user WHERE User='';" >> /tmp/sql
    echo "DROP DATABASE test;" >> /tmp/sql
    echo "FLUSH PRIVILEGES;" >> /tmp/sql
    cat /tmp/sql | mysql -u root --password="${DB_ROOT_PASS}"
    rm /tmp/sql
    rc-service mariadb stop
else
    rc-service mariadb status
    rc-service mariadb start
    rc-service mariadb stop
fi

mysqld --user=mysql --datadir=${DB_DATA_PATH}

イメージを適当な名前でビルドします。
イメージファイルは147MBとそこそこ大きいです。

$ dockebuild -t sample_mariadb:1.0 ./
Sending build context to Docker daemon  7.168kB
Step 1/5 : FROM alpine:latest
latest: Pulling from library/alpine
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
 ---> fff333dc0cce

(中略)

Step 5/5 : ENTRYPOINT /bin/sh /root/entrypoint.sh
 ---> Running in 9bd88df81bf7
Removing intermediate container 9bd88df81bf7
 ---> 32f67469c368
Successfully built 32f67469c368
Successfully tagged sample_mariadb:1.0

$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
sample_mariadb             1.0                 32f67469c368        6 minutes ago       147MB

コンテナを実行してみます。
このとき環境変数を渡してあげることをお忘れなく。
今回はユーザ名とパスワードだけ渡してます。

$ docker run --rm -p 3306:3306 -e DB_USER=sample -e DB_PASS=\!Passw0rd  sample_mariadb:1.0
Installing MariaDB/MySQL system tables in '/var/lib/mysql' ...
OK

(中略)

2019-10-02  1:49:09 0 [Note] mysqld: ready for connections.
Version: '10.3.17-MariaDB'  socket: '/run/mysqld/mysqld.sock'  port: 3306  MariaDB Server

外部から接続できればOK。

# mysql -h 192.168.10.7 -D sampledb -u sample -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [sampledb]>