discourse/bin/docker/boot_dev
Gary Pendergast cb5e0d358d
DEV: Run db:create in Docker dev container (#29295)
When attempting to [set up the Docker development environment](https://meta.discourse.org/t/install-discourse-for-development-using-docker/102009), I was seeing the following error when running `d/boot_dev --init`:

```
ActiveRecord::NoDatabaseError: We could not find your database: discourse_development. Available database configurations can be found in config/database.yml. (ActiveRecord::NoDatabaseError)
```

Running `db:create` before the `db:migrate` fixed this issue for me. It appears to be safe to run `db:create` even if the database already exists, running `d/rake db:create` locally shows an info message at the database already exists, but doesn't exit with an error.
2024-10-24 12:19:42 +02:00

133 lines
3.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
SCRIPTPATH=$(cd "$(dirname "$0")" > /dev/null; pwd -P)
SOURCE_DIR=$(cd "$SCRIPTPATH" > /dev/null; cd ../.. > /dev/null; pwd -P)
DATA_DIR="$SOURCE_DIR/data/postgres"
PLUGINS_DIR="$SOURCE_DIR/plugins"
show_help() {
cat <<EOF
Usage: ${0##*/} [-e VAR=VAL] [--env VAR=VAL] [--env-file filename] [-h] [--init]
-e, --env set environment variables
--env-file pass in a file containing a list of environment variable assignments
--init perform first-time initialization
-p --net-public publish ports on container on 0.0.0.0 (less secure as users on LAN may see dev env)
EOF
}
initialize=""
ENV_ARGS=""
local_publish="127.0.0.1"
while [ "${#@}" -ne "0" ]; do
case "$1" in
-h | --help)
show_help
exit 0
;;
-i | --init)
initialize="initialize"
;;
-p | --net-public)
local_publish="0.0.0.0"
;;
-e | --env)
if [ -z "$2" ]; then
show_help
exit 0
else
ENV_ARGS+=" -e $2"
shift
fi
;;
--env-file)
if [ -z "$2" ]; then
show_help
exit 0
else
ENV_ARGS="--env-file=$2"
break
fi
;;
*)
echo "unexpected argument: $1" >& 2
show_help >& 2
exit 1
;;
esac
shift
done
if [[ $(docker info -f "{{.Architecture}}") != *x86_64* ]]; then
echo "WARNING: Docker architecture is not x86_64."
echo "Discourse development is unlikely to work using Docker's architecture emulation."
echo "Please try a native development installation."
sleep 1
fi
echo "Using source in: ${SOURCE_DIR}"
echo "Using data in: ${DATA_DIR}"
mkdir -p "${DATA_DIR}"
mount_plugin_symlinks=""
for symlink in $(find $PLUGINS_DIR -maxdepth 1 -type l); do
# `readlink -f` doesn't work on macOS, to fix it you need to override the `readlink` with `greadlink`
# > brew install coreutils
# > ln -s "$(which greadlink)" "$(dirname "$(which greadlink)")/readlink"
# reference: https://meta.discourse.org/t/beginners-guide-to-install-discourse-for-development-using-docker/102009/124?u=aleber
symlink_value=$(readlink -f $symlink)
plugin_name=$(basename $symlink)
mount_plugin_symlinks+=" -v ${symlink_value}:/src/plugins/${plugin_name}:delegated"
done
[[ ! -z "$mount_plugin_symlinks" ]] && echo "Mounting symlinks for plugins: ${mount_plugin_symlinks}"
# 8025 mailhog
# 3000 puma... if you must (but unicorn is preferred)
# 9292 unicorn
# 9405 prometheus exporter
if [ "$(uname -m)" == "aarch64" ]; then
# NOTE: we currently (2024-01-17) dont build an aarch64 image, so one must be pre-built locally.
# Avoiding `docker pull` so we don't override that local image.
ENV_ARGS+=" -e SE_MANAGER_PATH=/usr/local/bin/selenium-manager "
else
# x86_64 environment - pull the latest image from dockerhub
docker pull discourse/discourse_dev:release
fi
docker run -d \
-p $local_publish:8025:8025 \
-p $local_publish:3000:3000 \
-p $local_publish:4200:4200 \
-p $local_publish:9292:9292 \
-p $local_publish:9405:9405 \
-v "$DATA_DIR:/shared/postgres_data:delegated" \
-v "$SOURCE_DIR:/src:delegated" \
-e UNICORN_BIND_ALL=true \
$mount_plugin_symlinks \
$ENV_ARGS \
--hostname=discourse \
--name=discourse_dev \
--restart=always \
discourse/discourse_dev:release /sbin/boot
echo "Installing gems..."
"${SCRIPTPATH}/bundle" install
echo "pnpm install..."
"${SCRIPTPATH}/exec" pnpm install
if [ "${initialize}" = "initialize" ]; then
echo "Migrating database..."
"${SCRIPTPATH}/rake" db:create
"${SCRIPTPATH}/rake" db:migrate
RAILS_ENV=test "${SCRIPTPATH}/rake" db:migrate
echo "Creating admin user..."
"${SCRIPTPATH}/rake" admin:create
fi