MySQL をセットアップし、Dockerfile 内でダンプをインポートする 質問する

MySQL をセットアップし、Dockerfile 内でダンプをインポートする 質問する

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.shGitHubでこのブロックを追加してデータのインポートを可能にしました

    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"]

データ コンテナーは、永続化のために開始状態である必要さえありません。

おすすめ記事