From aef5985fe50d1c9fc5629f400fcdf9abb57b9568 Mon Sep 17 00:00:00 2001 From: Hajbo Date: Thu, 19 Oct 2023 01:00:11 +0200 Subject: [PATCH] Almost working devcontainers --- .devcontainer.json | 17 +- bun.lockb | Bin 147340 -> 147340 bytes docker-compose.yml | 49 ----- docker/.env | 10 + docker/Dockerfile | 13 ++ docker/docker-compose.workspace.yml | 13 ++ docker/docker-compose.yml | 57 ++++++ environments/local/.env.app | 3 + .env => environments/local/.env.db | 4 +- scripts/create-db.sh | 15 -- scripts/create-start-container-with-env.sh | 22 ++- scripts/wait-for-db.sh | 215 --------------------- 12 files changed, 115 insertions(+), 303 deletions(-) delete mode 100644 docker-compose.yml create mode 100644 docker/.env create mode 100644 docker/Dockerfile create mode 100644 docker/docker-compose.workspace.yml create mode 100644 docker/docker-compose.yml create mode 100644 environments/local/.env.app rename .env => environments/local/.env.db (64%) delete mode 100755 scripts/create-db.sh delete mode 100755 scripts/wait-for-db.sh diff --git a/.devcontainer.json b/.devcontainer.json index 51cc3fb6..23194b65 100644 --- a/.devcontainer.json +++ b/.devcontainer.json @@ -2,9 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node-postgres { "name": "Bun & Postgres", - "dockerComposeFile": "docker-compose.yml", - "service": "app", - "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", + "dockerComposeFile": [ + "docker/docker-compose.yml", + "docker/docker-compose.workspace.yml" + ], + "service": "workspace", + "workspaceFolder": "/app", // Features to add to the dev container. More info: https://containers.dev/features. "features": { "ghcr.io/devcontainers/features/github-cli:1": {}, @@ -16,14 +19,6 @@ "ghcr.io/itsmechlark/features/postgresql:1.3.3": {} }, "waitFor": "onCreateCommand", - "updateContentCommand": "bun i", - "postAttachCommand": { - "app": "bun dev", - "studio": "bun db:studio", - "docs": "bun docs" - }, - // "postCreateCommand": "bun db:migrate && bun db:seed", - "postCreateCommand": "./scripts/create-db.sh", "customizations": { "vscode": { "extensions": [ diff --git a/bun.lockb b/bun.lockb index b7a0577d8d63340458ab9459fa751d2c33c40e33..5a77b0678ede71978d2e3dfa8135ddaa01904a8a 100755 GIT binary patch delta 56 zcmV-80LTA~{|Jo#2#_uySH@3`>7zu7uUKd}2u-N=ngN6x7SAxo&cfWbRwB@&fljqf O0WZt}GPi!r0Sip0S&2; fi } - -usage() -{ - cat << USAGE >&2 -Usage: - $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] - -h HOST | --host=HOST Host or IP under test - -p PORT | --port=PORT TCP port under test - Alternatively, you specify the host and port as host:port - -s | --strict Only execute subcommand if the test succeeds - -q | --quiet Don't output any status messages - -t TIMEOUT | --timeout=TIMEOUT - Timeout in seconds, zero for no timeout - -- COMMAND ARGS Execute command with args after the test finishes -USAGE - exit 1 -} - -wait_for() -{ - if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then - echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" - else - echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" - fi - WAITFORIT_start_ts=$(date +%s) - while : - do - if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then - nc -z $WAITFORIT_HOST $WAITFORIT_PORT - WAITFORIT_result=$? - else - (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 - WAITFORIT_result=$? - fi - if [[ $WAITFORIT_result -eq 0 ]]; then - WAITFORIT_end_ts=$(date +%s) - echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" - break - fi - sleep 1 - done - return $WAITFORIT_result -} - -wait_for_wrapper() -{ - # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 - if [[ $WAITFORIT_QUIET -eq 1 ]]; then - timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & - else - timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & - fi - WAITFORIT_PID=$! - trap "kill -INT -$WAITFORIT_PID" INT - wait $WAITFORIT_PID - WAITFORIT_RESULT=$? - if [[ $WAITFORIT_RESULT -ne 0 ]]; then - echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" - fi - return $WAITFORIT_RESULT -} - -# process arguments -while [[ $# -gt 0 ]] -do - case "$1" in - *:* ) - WAITFORIT_hostport=(${1//:/ }) - WAITFORIT_HOST=${WAITFORIT_hostport[0]} - WAITFORIT_PORT=${WAITFORIT_hostport[1]} - shift 1 - ;; - --child) - WAITFORIT_CHILD=1 - shift 1 - ;; - -q | --quiet) - WAITFORIT_QUIET=1 - shift 1 - ;; - -s | --strict) - WAITFORIT_STRICT=1 - shift 1 - ;; - -h) - WAITFORIT_HOST="$2" - if [[ $WAITFORIT_HOST == "" ]]; then break; fi - shift 2 - ;; - --host=*) - WAITFORIT_HOST="${1#*=}" - shift 1 - ;; - -p) - WAITFORIT_PORT="$2" - if [[ $WAITFORIT_PORT == "" ]]; then break; fi - shift 2 - ;; - --port=*) - WAITFORIT_PORT="${1#*=}" - shift 1 - ;; - -t) - WAITFORIT_TIMEOUT="$2" - if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi - shift 2 - ;; - --timeout=*) - WAITFORIT_TIMEOUT="${1#*=}" - shift 1 - ;; - --) - shift - WAITFORIT_CLI=("$@") - break - ;; - --help) - usage - ;; - *) - echoerr "Unknown argument: $1" - usage - ;; - esac -done - -if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then - echoerr "Error: you need to provide a host and port to test." - usage -fi - -WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} -WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} -WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} -WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} - -# Check to see if timeout is from busybox? -WAITFORIT_TIMEOUT_PATH=$(type -p timeout) -WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) - -WAITFORIT_BUSYTIMEFLAG="" -if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then - WAITFORIT_ISBUSY=1 - # Check if busybox timeout uses -t flag - # (recent Alpine versions don't support -t anymore) - if timeout &>/dev/stdout | grep -q -e '-t '; then - WAITFORIT_BUSYTIMEFLAG="-t" - fi -else - WAITFORIT_ISBUSY=0 -fi - -if [[ $WAITFORIT_CHILD -gt 0 ]]; then - wait_for - WAITFORIT_RESULT=$? - exit $WAITFORIT_RESULT -else - if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then - wait_for_wrapper - WAITFORIT_RESULT=$? - else - wait_for - WAITFORIT_RESULT=$? - fi -fi - -if [[ $WAITFORIT_CLI != "" ]]; then - if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then - echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" - exit $WAITFORIT_RESULT - fi - exec "${WAITFORIT_CLI[@]}" -else - exit $WAITFORIT_RESULT -fi - -# wait for db -if [ "$WAITFORIT_TIMEOUT" -gt 0 ]; then - echo "wait-for-db.sh: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" -else - echo "wait-for-db.sh: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" - - # Initialize variables for the loop - max_retries=5 - count=0 - - # Loop to retry database connection - while [[ $count -lt $max_retries ]] - do - PGPASSWORD=${POSTGRES_PASSWORD} psql -h $WAITFORIT_HOST -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c 'SELECT 1;' &>/dev/null - exit_status=$? - if [ $exit_status -eq 0 ]; then - echo "wait-for-db.sh: database is ready" - exit 0 - fi - echo "wait-for-db.sh: database not ready yet. Retrying... ($((count+1))/$max_retries)" - ((count++)) - sleep 5 - done - - # If it reaches here, it means it failed to connect to the database after max_retries - echo "wait-for-db.sh: Failed to connect to database after $max_retries retries." - exit 1 -fi