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
環境
- raspberry pi 3 model b
- Raspbian Buster
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]>