DockerでRedashの環境を構築してみる+別プロジェクトのDocker上のMySQLに接続してみる(Windows)

下記の記事を参考にDockerにRedashの環境を作成して、MySQLに接続してみました。

dockerでRedash環境を立ち上げる – ほたてメモ

Redash環境をDocker Composeで構築

redashをdockerだけで起動するメモ #redash – Qiita

接続するMySQLは下記で構築したものです。

Redashのリポジトリをクローン

git clone https://github.com/getredash/redash.git

クローン後、ディレクトリを移動します。

cd redash

Dockerfileを編集

クローンしてきたDockerfileをあれこれ加筆修正するのですが、箇所が多すぎるので内容を下記でまるっと上書きします。

修正内容
FROM node:18-bookworm AS frontend-builder

# Install yarn globally
RUN npm install --global --force yarn@1.22.22

ARG skip_frontend_build
ENV CYPRESS_INSTALL_BINARY=0
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1

RUN useradd -m -d /frontend redash
USER redash

WORKDIR /frontend

# Copy necessary files
COPY --chown=redash package.json yarn.lock .yarnrc /frontend/
COPY --chown=redash viz-lib /frontend/viz-lib
COPY --chown=redash scripts /frontend/scripts

ARG code_coverage
ENV BABEL_ENV=${code_coverage:+test}

# Set yarn network timeout
RUN yarn config set network-timeout 300000

# Install dependencies if not skipping frontend build
RUN test -z "$skip_frontend_build" && yarn install --frozen-lockfile --network-concurrency 1 || true

COPY --chown=redash client /frontend/client
COPY --chown=redash webpack.config.js /frontend/

# Build frontend or create placeholder files
RUN bash -c 'if [ -z "$skip_frontend_build" ]; then yarn build; else mkdir -p /frontend/client/dist && touch /frontend/client/dist/multi_org.html /frontend/client/dist/index.html; fi'

# --- Python backend ---
FROM python:3.10-slim-bookworm

EXPOSE 5000

RUN useradd --create-home redash

# Install system dependencies
RUN apt-get update && \
  apt-get install -y --no-install-recommends \
  pkg-config \
  curl \
  gnupg \
  build-essential \
  pwgen \
  libffi-dev \
  sudo \
  git-core \
  libkrb5-dev \
  libpq-dev \
  g++ unixodbc-dev \
  xmlsec1 \
  libssl-dev \
  default-libmysqlclient-dev \
  freetds-dev \
  libsasl2-dev \
  unzip \
  npm \
  libsasl2-modules-gssapi-mit && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*


RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
    apt-get install -y nodejs && \
    npm install -g yarn@1.22.22

ARG TARGETPLATFORM
ARG databricks_odbc_driver_url=https://databricks-bi-artifacts.s3.us-east-2.amazonaws.com/simbaspark-drivers/odbc/2.6.26/SimbaSparkODBC-2.6.26.1045-Debian-64bit.zip

# Install ODBC drivers if on amd64
RUN bash -c 'if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg && \
    curl https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list && \
    apt-get update && \
    ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    curl "$databricks_odbc_driver_url" --location --output /tmp/simba_odbc.zip && \
    chmod 600 /tmp/simba_odbc.zip && \
    unzip /tmp/simba_odbc.zip -d /tmp/simba && \
    dpkg -i /tmp/simba/*.deb && \
    printf "[Simba]\nDriver = /opt/simba/spark/lib/64/libsparkodbc_sb64.so" >> /etc/odbcinst.ini && \
    rm /tmp/simba_odbc.zip && \
    rm -rf /tmp/simba; fi'

WORKDIR /app

ENV POETRY_VERSION=2.1.4
ENV POETRY_HOME=/etc/poetry
ENV POETRY_VIRTUALENVS_CREATE=false
# Install Poetry
RUN curl -sSL https://install.python-poetry.org | python3 -

# Clear Poetry cache
RUN /etc/poetry/bin/poetry cache clear pypi --all

COPY pyproject.toml poetry.lock ./

ARG POETRY_OPTIONS="--no-root --no-interaction --no-ansi"
ARG install_groups="main,all_ds,dev"
RUN /etc/poetry/bin/poetry install --only $install_groups $POETRY_OPTIONS

COPY --chown=redash . /app
COPY --from=frontend-builder --chown=redash /frontend/client/dist /app/client/dist
RUN chown redash /app
USER redash

ENTRYPOINT ["/app/bin/docker-entrypoint"]
CMD ["server"]

アプリケーションの定義ファイル(YAML)を修正

個人的にcompose.yamlよりdocker-compose.ymlの方が好き&馴染みがあるので、まずはファイル名を修正します。

ren compose.yaml docker-compose.yml

Dockerfile同様に加筆修正するのですが、面倒なのでこちらも丸コピで。
なお、ネットワークの設定をMySQLと合わせてありますので、独自で環境を作った方は適宜修正してください。

修正内容
# This configuration file is for the **development** setup.
# For a production example please refer to getredash/setup repository on GitHub.
x-redash-service: &redash-service
  build:
    context: .
    args:
      skip_frontend_build: "true"  # set to empty string to build
  volumes:
    - .:/app
  env_file:
    - .env
  networks:
    - mysql_default
x-redash-environment: &redash-environment
  REDASH_HOST: http://localhost:5001
  REDASH_LOG_LEVEL: "INFO"
  REDASH_REDIS_URL: "redis://redis:6379/0"
  REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
  REDASH_RATELIMIT_ENABLED: "false"
  REDASH_MAIL_DEFAULT_SENDER: "redash@example.com"
  REDASH_MAIL_SERVER: "email"
  REDASH_MAIL_PORT: 1025
  REDASH_ENFORCE_CSRF: "true"
  REDASH_GUNICORN_TIMEOUT: 60
  # Set secret keys in the .env file
services:
  server:
    <<: *redash-service
    command: dev_server
    depends_on:
      - postgres
      - redis
    ports:
      - "5001:5000"
      - "5678:5678"
    environment:
      <<: *redash-environment
      PYTHONUNBUFFERED: 0
    networks:
      - mysql_default
  scheduler:
    <<: *redash-service
    command: dev_scheduler
    depends_on:
      - server
    environment:
      <<: *redash-environment
    networks:
    - mysql_default
  worker:
    <<: *redash-service
    command: dev_worker
    depends_on:
      - server
    environment:
      <<: *redash-environment
      PYTHONUNBUFFERED: 0
    networks:
      - mysql_default
  redis:
    image: redis:7-alpine
    restart: unless-stopped
    networks:
      - mysql_default
  postgres:
    image: postgres:18-alpine
    ports:
      - "15432:5432"
    # The following turns the DB into less durable, but gains significant performance improvements for the tests run (x3
    # improvement on my personal machine). We should consider moving this into a dedicated Docker Compose configuration for
    # tests.
    command: "postgres -c fsync=off -c full_page_writes=off -c synchronous_commit=OFF"
    restart: unless-stopped
    environment:
      POSTGRES_HOST_AUTH_METHOD: "trust"
    volumes:
      - db-store:/var/lib/postgresql/data
    networks:
      - mysql_default
  email:
    image: maildev/maildev
    ports:
      - "1080:1080"
      - "1025:1025"
    restart: unless-stopped
    networks:
      - mysql_default
volumes:
  db-store:
networks:
  mysql_default:
    external: true

.envファイルを作成

.envファイルがないとbuildに失敗するので作成します。

type nul > .env

内容は下記(odanekoの部分は任意で変更)。

REDASH_COOKIE_SECRET='odaneko'

コンテナをビルド

docker compose build

完了までかなり時間がかかると思います。
最終的に下記が表示されたらOKです。

データベース作成

docker compose run --rm server create_db

yarnをインストール・ビルド

yarnをインストール

docker compose run --rm server yarn install

完了までかなり時間がかかると思います。
最終的に下記が表示されたらOKです。

yarnをインストール

docker compose run --rm server yarn run build

完了までかなり時間がかかると思います。
最終的に下記が表示されたらOKです。

コンテナを起動

docker compose up -d

Dockerの画面上でもRedashのコンテナが起動していることを確認します。

Redashに初回ログイン

Redashにアクセス

コンテナ起動直後は中でいろいろと起動中のようですので、少し時間がたってから下記のURLにアクセスします。
http://localhost:5001
Redashのセットアップ画面が表示されたら正常に環境構築ができています。

管理ユーザーを作成

所詮ローカル環境なので、メールアドレスは存在しない適当なアドレスでOKです。
あとメール購読系は邪魔なのチェックを外します。(存在しないアドレスなので、別にいいんですけど)

Redashの管理画面にログイン出来たらOKです。

MySQLに接続

下記の記事で作成したMySQLに接続してみます。

左下のSettingsをクリック。

New Data Sourceをクリック。

ポップアップでMySQLを選択し、接続情報を入力していきます。

接続情報を入力したら、一番下のCreateをクリック。

下にスクロールして・・・

Saveボタンをクリック。

Test Connectionをクリックして、Successと表示されたらOKです。

MySQLにクエリを実行してみる

左側のQueriesをクリック→右上のNew Queryをクリック。

左上のプルダウンでデータベースを選択して、適当にクエリを実行してレコードが取得できていることを確認します。

以上になります。
お読み頂き、ありがとうございました。