mirror of
https://github.com/apache/superset.git
synced 2026-07-09 08:15:49 +00:00
Fix two follow-on issues reported when starting the dev stack with docker-compose-mysql.yml: 1. ``superset-init`` step 4 (load-examples) fails with ``MySQLdb.OperationalError: (2002, "Can't connect to server on 'db'")`` because the analytics-examples DB connection inherits ``EXAMPLES_PORT=5432`` (Postgres port) from ``docker/.env``. The override flipped ``DATABASE_DIALECT`` to ``mysql+mysqldb`` but left the EXAMPLES_* group on Postgres defaults, so the URI became ``mysql+mysqldb://examples:examples@db:5432/examples`` — MySQL container has no listener on 5432. Fix: add ``EXAMPLES_HOST/PORT/DB/USER/PASSWORD`` and a complete ``SUPERSET__SQLALCHEMY_EXAMPLES_URI`` to the ``mysql-env`` anchor. 2. The Postgres init scripts under ``docker/docker-entrypoint-initdb.d/`` (``cypress-init.sh``, ``examples-init.sh``) get mounted on the MySQL container too — compose merges volume lists. They invoke ``psql`` which doesn't exist in the MySQL image, abort with ``psql: command not found``, and prevent the ``examples`` DB from being created. Fix: add a MySQL-specific init script ``docker/mysql-init/examples-init.sql`` that creates the ``examples`` database and user, and mount it at ``/docker-entrypoint-initdb.d`` in the override. Compose's later-takes-precedence rule on duplicate volume targets displaces the Postgres init dir, so the MySQL container only sees the MySQL-compatible script. (Used a plain duplicate-target mount rather than the ``!override`` tag because pre-commit's ``check-yaml`` doesn't recognize Compose's custom YAML tags.) Recovery for an existing failed MySQL stack: ``docker compose -f docker-compose.yml -f docker-compose-mysql.yml down``, then ``docker volume rm superset_db_home_mysql`` (so the new init script runs on the next fresh boot), then ``up`` again. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
118 lines
4.6 KiB
YAML
118 lines
4.6 KiB
YAML
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
# Compose override that swaps the default Postgres metadata DB for MySQL 8.
|
|
# Useful for evaluating dialect-specific behaviour (e.g., DDL-migration
|
|
# cost on a deployment whose production metadata DB is MySQL).
|
|
#
|
|
# Usage:
|
|
# docker compose -f docker-compose.yml -f docker-compose-mysql.yml up
|
|
# docker compose -f docker-compose.yml -f docker-compose-mysql.yml down
|
|
#
|
|
# To switch back to Postgres, just drop the second `-f` flag — the MySQL
|
|
# data lives in a separate volume (`db_home_mysql`) so neither side is
|
|
# corrupted by switching dialects.
|
|
#
|
|
# Notes:
|
|
# - Mirrors the connection settings used by CI's `test-mysql` shard:
|
|
# dialect ``mysql+mysqldb``, charset utf8mb4 with binary_prefix.
|
|
# - Host port 13306 (configurable via DATABASE_PORT_MYSQL) to avoid
|
|
# colliding with a native MySQL install on 3306.
|
|
# - The Postgres-specific init scripts under
|
|
# docker/docker-entrypoint-initdb.d/ are not mounted (they are
|
|
# postgres-only); examples / cypress fixtures still load via
|
|
# `superset-init`'s post-startup steps.
|
|
|
|
# Shared environment override applied to every Superset-side service that
|
|
# connects to the metadata DB. ``environment:`` takes precedence over the
|
|
# values inherited from the env_file in docker-compose.yml.
|
|
x-mysql-env: &mysql-env
|
|
DATABASE_DIALECT: mysql+mysqldb
|
|
DATABASE_HOST: db
|
|
DATABASE_PORT: "3306"
|
|
DATABASE_DB: superset
|
|
DATABASE_USER: superset
|
|
DATABASE_PASSWORD: superset
|
|
SQLALCHEMY_DATABASE_URI: "mysql+mysqldb://superset:superset@db:3306/superset?charset=utf8mb4&binary_prefix=true"
|
|
# Override the analytics-examples DB connection too. ``EXAMPLES_PORT``
|
|
# in docker/.env is hardcoded to 5432 (the Postgres port); without
|
|
# this override the examples connection would try MySQL on 5432 and
|
|
# fail. The examples user/DB are created by docker/mysql-init/
|
|
# examples-init.sql on first MySQL boot.
|
|
EXAMPLES_HOST: db
|
|
EXAMPLES_PORT: "3306"
|
|
EXAMPLES_DB: examples
|
|
EXAMPLES_USER: examples
|
|
EXAMPLES_PASSWORD: examples
|
|
SUPERSET__SQLALCHEMY_EXAMPLES_URI: "mysql+mysqldb://examples:examples@db:3306/examples?charset=utf8mb4&binary_prefix=true"
|
|
|
|
services:
|
|
db:
|
|
image: mysql:8.0
|
|
environment:
|
|
MYSQL_DATABASE: superset
|
|
MYSQL_USER: superset
|
|
MYSQL_PASSWORD: superset
|
|
MYSQL_ROOT_PASSWORD: root
|
|
# The original 5432 port mapping is harmless on a MySQL container
|
|
# (nothing listens on 5432 inside it) but we add 13306->3306 so the
|
|
# MySQL port is reachable from the host without colliding with a
|
|
# native MySQL on 3306. Compose merges port lists.
|
|
ports:
|
|
- "127.0.0.1:${DATABASE_PORT_MYSQL:-13306}:3306"
|
|
# Override the init-scripts mount by re-binding the same target path
|
|
# to a MySQL-compatible directory. Compose merges volume lists by
|
|
# target path; later definitions win on conflict, so this displaces
|
|
# the Postgres-specific ``./docker/docker-entrypoint-initdb.d`` mount
|
|
# from docker-compose.yml. Without this, MySQL would try to run
|
|
# ``cypress-init.sh`` (which invokes ``psql``, not in the MySQL
|
|
# image), abort the init phase, and never create the ``examples``
|
|
# database. Add the MySQL data volume separately.
|
|
volumes:
|
|
- db_home_mysql:/var/lib/mysql
|
|
- ./docker/mysql-init:/docker-entrypoint-initdb.d
|
|
command:
|
|
- --default-authentication-plugin=caching_sha2_password
|
|
- --character-set-server=utf8mb4
|
|
- --collation-server=utf8mb4_0900_ai_ci
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -proot --silent"]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 20
|
|
|
|
superset:
|
|
environment: *mysql-env
|
|
|
|
superset-init:
|
|
environment: *mysql-env
|
|
|
|
superset-worker:
|
|
environment: *mysql-env
|
|
|
|
superset-worker-beat:
|
|
environment: *mysql-env
|
|
|
|
superset-node:
|
|
environment: *mysql-env
|
|
|
|
superset-tests-worker:
|
|
environment: *mysql-env
|
|
|
|
volumes:
|
|
db_home_mysql:
|