diff --git a/Dockerfile b/Dockerfile index 47db5924d..b535c0080 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,6 @@ RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ - default-mysql-client \ python3-dev \ libffi-dev \ libssl-dev \ diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 61d71e425..bab69ee53 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -7,7 +7,6 @@ ACCESS_LOG=${ACCESS_LOG:--} ERROR_LOG=${ERROR_LOG:--} WORKER_TEMP_DIR=${WORKER_TEMP_DIR:-/dev/shm} SECRET_KEY=${SECRET_KEY:-} -DATABASE_URL=${DATABASE_URL:-} # Check that a .ctfd_secret_key file or SECRET_KEY envvar is set if [ ! -f .ctfd_secret_key ] && [ -z "$SECRET_KEY" ]; then @@ -19,22 +18,8 @@ if [ ! -f .ctfd_secret_key ] && [ -z "$SECRET_KEY" ]; then fi fi -# Check that the database is available -if [ -n "$DATABASE_URL" ] - then - url=`echo $DATABASE_URL | awk -F[@//] '{print $4}'` - database=`echo $url | awk -F[:] '{print $1}'` - port=`echo $url | awk -F[:] '{print $2}'` - echo "Waiting for $database:$port to be ready" - while ! mysqladmin ping -h "$database" -P "$port" --silent; do - # Show some progress - echo -n '.'; - sleep 1; - done - echo "$database is ready" - # Give it another second. - sleep 1; -fi +# Ensures that the database is available +python ping.py # Initialize database python manage.py db upgrade diff --git a/ping.py b/ping.py new file mode 100644 index 000000000..b7a66b1ec --- /dev/null +++ b/ping.py @@ -0,0 +1,34 @@ +""" +Script for checking that a database server is available. +Essentially a cross-platform, database agnostic mysqladmin. +""" +import time + +from sqlalchemy import create_engine +from sqlalchemy.engine.url import make_url + +from CTFd.config import Config + +url = make_url(Config.DATABASE_URL) + +# Ignore sqlite databases +if url.drivername.startswith("sqlite"): + exit(0) + +# Null out the database so raw_connection doesnt error if it doesnt exist +# CTFd will create the database if it doesnt exist +url.database = None + +# Wait for the database server to be available +engine = create_engine(url) +print(f"Waiting for {url} to be ready") +while True: + try: + engine.raw_connection() + break + except Exception: + print(".", end="", flush=True) + time.sleep(1) + +print(f"{url} is ready") +time.sleep(1)