Ccmmutty logo
Commutty IT
7 min read

【SQL】100本ノックをM1Macで進めたい

https://cdn.magicode.io/media/notebox/35102e18-9d26-4809-910d-08961b2b3ff1.jpeg

やること

SQL100本ノックの環境構築を行う。

環境

PC

MacBook Pro (13-inch, M1, 2020)
Apple M1
MacOS Monterey 12.2.1

Docker

Version : 4.15.0 (93002)
Engine : 20.10.21
Compose : v2.13.0

対象読者

  • SQL100本ノックをやりたい
  • 使用しているPCがM1Mac
  • SQL100本ノックに出てくる手順通りに環境構築を進めたがエラーで進まない
私の環境で起こったことです。どなたかの参考になれば。
途中、Rの依存パッケージインストールをすっ飛ばしますが、
Python or SQLしか使用していない現在は問題なく動いています。

環境構築手順

1. Terminalで実行

まずはSQL100本ノックのInstall通りに実行します。

???「あれれ〜おかしいぞぉ〜?」

こんなエラーが出てコケました。
> [2/6] RUN mamba install --quiet --yes r-themis==0.1.4 r-rpostgresql==0.6_2     && find / -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} ;     && find / -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} ;:                        
#0 6.519 Encountered problems while solving:
#0 6.519   - nothing provides requested r-rpostgresql 0.6_2
#0 6.519   - nothing provides r-rann needed by r-themis-0.1.4-r40hc72bb7e_0
#0 6.519
requirement満たしてるのに・・・
Apple M1チップ搭載のMacの場合は Docker Desktop 4.4.2 以降
と言ってても進まないので。

2. DockerfileとDocker-compose.ymlの修正

結論、各ファイルを以下のように修正します。

Dockerfile

パス
100knocks-preprocess-master/dockerfiles/notebook/Dockerfile
変更点
  • 6〜9行目をコメントアウト
  • 16,17行目を追加
  • 19行目をコメントアウトし、20行目の記載に変更
  • 21行目をコメントアウト
FROM jupyter/datascience-notebook:python-3.10.6
#FROM jupyter/datascience-notebook:d53a302fbcd0
USER root

# mambaでR依存パッケージをインストール
#RUN mamba install --quiet --yes r-themis==0.1.4 r-rpostgresql==0.6_2 \
#RUN mamba install --quiet --yes r-base==3.5 r-themis==0.1.1 r-rpostgresql \
#    && find / -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
#    && find / -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \;

USER jovyan
WORKDIR /home/jovyan
COPY Pipfile .
COPY Pipfile.lock .

RUN pip install --upgrade pip \
    && pip install ipython-sql

#RUN pip install --no-cache-dir pipenv==2021.5.29 \
RUN pip install --no-cache-dir psycopg2-binary \
#    &&pipenv install --system \
    && rm -rf Pipfile* /tmp/* /var/tmp/*

HEALTHCHECK --interval=5s --retries=20 CMD ["curl", "-s", "-S", "-o", "/dev/null", "http://localhost:8888"]

docker-compose.yml

パス
100knocks-preprocess-master/docker-compose.yml
変更点
  • 18行目の追加
POSTGRES_HOST_AUTH_METHOD=trust
SQLSTATE[08006] [7] SCRAM authentication requires libpq version 10 or above
追加せずにdocker composeすると出るので対応です。
こちら参照させていただきました。
version: "3.8"

services:
  db:
    build:
      context: .
      dockerfile: dockerfiles/postgres/Dockerfile
    image: dss-postgres
    container_name: dss-postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres12345
      - PGPASSWORD=postgres12345
      - POSTGRES_DB=dsdojo_db
      - DATABASE_HOST=localhost
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - ./docker/db/init:/docker-entrypoint-initdb.d
      - ./docker/work/data:/tmp/data

  notebook:
    build:
      context: .
      dockerfile: dockerfiles/notebook/Dockerfile
    image: dss-notebook
    container_name: dss-notebook
    ports:
      - "8888:8888"
    environment:
      - PG_PORT=5432
      - PG_USER=padawan
      - PG_PASSWORD=padawan12345
      - PG_DATABASE=dsdojo_db
      - JUPYTER_ENABLE_LAB=yes
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./docker/doc:/home/jovyan/doc
      - ./docker/work:/home/jovyan/work
    command: start-notebook.sh --NotebookApp.token=''

3.再度立ち上げる!

ここまで来たら再度「1.Terminalで実行」の手順に従って進めます。
きっとこうなるはず
[+] Running 3/3
 ⠿ Network 100knocks-preprocess-master_default  Created
 ⠿ Container dss-postgres                       Healthy
 ⠿ Container dss-notebook                       Started
無事に上記のメッセージが返ってきたら、
ブラウザにlocalhost:8888と打ち込んでjupyter labの画面を出しましょう。

4. もう一箇所・・・

SQL用ファイルの一番初めのセルがこうなっています。
%load_ext sql
import os

pgconfig = {
    'host': 'db',
    'port': os.environ['PG_PORT'],
    'database': os.environ['PG_DATABASE'],
    'user': os.environ['PG_USER'],
    'password': os.environ['PG_PASSWORD'],
}
dsl = 'postgres://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)

# MagicコマンドでSQLを書くための設定
%sql $dsl
このまま実行すると以下のエラーになるので
The sql extension is already loaded. To reload it, use:
  %reload_ext sql
Connection info needed in SQLAlchemy format, example:
               postgresql://username:password@hostname/dbname
               or an existing connection: dict_keys(['postgresql://padawan:***@db:5432/dsdojo_db'])
Can't load plugin: sqlalchemy.dialects:postgres
Connection info needed in SQLAlchemy format, example:
               postgresql://username:password@hostname/dbname
               or an existing connection: dict_keys(['postgresql://padawan:***@db:5432/dsdojo_db'])
dsl = の部分を修正します。
- dsl = 'postgres://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)
+ dsl = 'postgresql://{user}:{password}@{host}:{port}/{database}'.format(**pgconfig)

完了!

以上の手順で解決したので備忘として残しておきます。
M1Macってしんどいこと多いな・・

ちなみに

2017IntelシリコンのMacBookProだと全く問題なく環境構築終わりました。
意地でもM1Macで動かしたいよわよわエンジニアの四方山話でした。

Discussion

コメントにはログインが必要です。