LAMP プロジェクト用に Dockerfile をセットアップしようとしていますが、MySQL を起動するときにいくつか問題が発生しています。Dockerfile には次の行があります。
VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql
しかし、このエラーが繰り返し発生します:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Dockerfile ビルド中にデータベースの作成とダンプのインポートを設定する方法について何かアイデアはありますか?
ベストアンサー1
公式の最新版MySQL Docker イメージ起動時にデータをインポートできます。これが私のdocker-compose.ymlです
data:
build: docker/data/.
mysql:
image: mysql
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234
volumes:
- ./docker/data:/docker-entrypoint-initdb.d
volumes_from:
- data
docker/data
ここでは、 docker-compose が実行されているフォルダーに相対的なdata-dump.sql があります。その sql ファイルを/docker-entrypoint-initdb.d
コンテナーのこのディレクトリにマウントしています。
これがどのように機能するか興味があれば、docker-entrypoint.sh
GitHubでこのブロックを追加してデータのインポートを可能にしました
echo
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
追加の注意点として、mysql コンテナが停止して削除された後もデータを保持したい場合は、docker-compose.yml にあるように別のデータ コンテナが必要です。データ コンテナ Dockerfile の内容は非常にシンプルです。
FROM n3ziniuka5/ubuntu-oracle-jdk:14.04-JDK8
VOLUME /var/lib/mysql
CMD ["true"]
データ コンテナーは、永続化のために開始状態である必要さえありません。