Switch backend to wait for SQL Server and use direct INSERTs
Replace stored procedure calls with inline INSERT statements and SCOPE_IDENTITY() Add netcat for readiness check in new entrypoint.sh Introduce dedicated SQL Server and init-db services in docker-compose
This commit is contained in:
@@ -20,15 +20,19 @@ FROM alpine:3.19
|
|||||||
|
|
||||||
# Install ca-certificates (if needed)
|
# Install ca-certificates (if needed)
|
||||||
RUN apk add --no-cache ca-certificates
|
RUN apk add --no-cache ca-certificates
|
||||||
|
RUN apk add --no-cache netcat-openbsd
|
||||||
|
|
||||||
# Set workdir
|
# Set workdir
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
# Removed hosts entry addition (handled via docker-compose extra_hosts)
|
||||||
|
|
||||||
# Copy the binary from the builder stage
|
# Copy the binary from the builder stage
|
||||||
COPY --from=builder /app/main .
|
COPY --from=builder /app/main .
|
||||||
|
|
||||||
# Expose the application port (default for the Go server)
|
# Expose the application port (default for the Go server)
|
||||||
|
COPY entrypoint.sh .
|
||||||
|
RUN chmod +x entrypoint.sh
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
# Command to run the binary
|
# Command to run the binary
|
||||||
CMD ["./main"]
|
CMD ["./entrypoint.sh"]
|
||||||
|
|||||||
24
backend/entrypoint.sh
Normal file
24
backend/entrypoint.sh
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
# entrypoint.sh – wait for the SQL Server container to become ready
|
||||||
|
# before starting the Go backend binary.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Default environment variables (can be overridden in docker-compose)
|
||||||
|
: "${DB_SERVER:=sql}"
|
||||||
|
: "${DB_USER:=sa}"
|
||||||
|
: "${DB_PASSWORD:=Ou812@12!@}"
|
||||||
|
|
||||||
|
# Wait until netcat can successfully connect to the SQL Server port
|
||||||
|
while ! nc -z "$DB_SERVER" 1433; do
|
||||||
|
echo "⏳ Waiting for SQL Server at $DB_SERVER:1433..."
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# Add a short pause after the port is open to let SQL Server finish startup
|
||||||
|
sleep 5
|
||||||
|
# Add a short pause after the port is open to let SQL Server finish startup
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
echo "✅ SQL Server is ready. Starting backend."
|
||||||
|
exec ./main
|
||||||
@@ -41,17 +41,9 @@ func main() {
|
|||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
var newCustID int
|
var newCustID int
|
||||||
insertCustSQL := `
|
insertCustSQL := `
|
||||||
DECLARE @NewID int;
|
INSERT INTO dbo.Customers (CustomerName, AddressLine1, AddressLine2, City, State, ZipCode, Country)
|
||||||
EXEC dbo.sp_InsertCustomer
|
VALUES (@name, @addr1, @addr2, @city, @state, @zip, @country);
|
||||||
@CustomerName = @name,
|
SELECT SCOPE_IDENTITY() AS NewID;
|
||||||
@AddressLine1 = @addr1,
|
|
||||||
@AddressLine2 = @addr2,
|
|
||||||
@City = @city,
|
|
||||||
@State = @state,
|
|
||||||
@ZipCode = @zip,
|
|
||||||
@Country = @country,
|
|
||||||
@NewCustomerID = @NewID OUTPUT;
|
|
||||||
SELECT @NewID;
|
|
||||||
`
|
`
|
||||||
row := db.QueryRow(insertCustSQL,
|
row := db.QueryRow(insertCustSQL,
|
||||||
sql.Named("name", "Acme Corp"),
|
sql.Named("name", "Acme Corp"),
|
||||||
@@ -72,14 +64,9 @@ SELECT @NewID;
|
|||||||
// -----------------------------------------------------------------
|
// -----------------------------------------------------------------
|
||||||
var newContactID int
|
var newContactID int
|
||||||
insertContactSQL := `
|
insertContactSQL := `
|
||||||
DECLARE @NewContactID int;
|
INSERT INTO dbo.Contacts (CustomerID, ContactTypeID, ContactValue, IsPrimary)
|
||||||
EXEC dbo.sp_InsertContact
|
VALUES (@custID, @typeID, @value, @primary);
|
||||||
@CustomerID = @custID,
|
SELECT SCOPE_IDENTITY() AS NewContactID;
|
||||||
@ContactTypeID = @typeID,
|
|
||||||
@ContactValue = @value,
|
|
||||||
@IsPrimary = @primary,
|
|
||||||
@NewContactID = @NewContactID OUTPUT;
|
|
||||||
SELECT @NewContactID;
|
|
||||||
`
|
`
|
||||||
// Assume ContactTypeID 1 = Phone (created by init.sql)
|
// Assume ContactTypeID 1 = Phone (created by init.sql)
|
||||||
row = db.QueryRow(insertContactSQL,
|
row = db.QueryRow(insertContactSQL,
|
||||||
|
|||||||
27
db/Dockerfile
Normal file
27
db/Dockerfile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Dockerfile for DB init service
|
||||||
|
|
||||||
|
FROM mcr.microsoft.com/mssql/server:2022-latest
|
||||||
|
|
||||||
|
# Set SQL Server environment variables
|
||||||
|
ENV SA_PASSWORD=Ou812@12!@ \
|
||||||
|
ACCEPT_EULA=Y
|
||||||
|
|
||||||
|
# Set working directory inside the container
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
# Copy the initialization script and SQL file into the image
|
||||||
|
COPY --chmod=0755 init.sh .
|
||||||
|
COPY init.sql .
|
||||||
|
|
||||||
|
# Make the script executable
|
||||||
|
|
||||||
|
|
||||||
|
# Start SQL Server, wait until it is ready, then run the init script
|
||||||
|
CMD /opt/mssql/bin/sqlservr & \
|
||||||
|
/bin/bash -c "\
|
||||||
|
until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $$SA_PASSWORD -Q \"SELECT 1\" >/dev/null 2>&1; do \
|
||||||
|
sleep 1; \
|
||||||
|
done && \
|
||||||
|
./init.sh && \
|
||||||
|
tail -f /dev/null \
|
||||||
|
"
|
||||||
32
db/init.sh
Normal file
32
db/init.sh
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# init.sh - Initialize the SQL Server database with the schema and sample data.
|
||||||
|
# This script is intended to be run inside the SQL Server container (or from the host
|
||||||
|
# with sqlcmd reachable). It executes the init.sql script located in the same
|
||||||
|
# directory.
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Default connection settings – can be overridden via environment variables
|
||||||
|
: "${DB_SERVER:=localhost}"
|
||||||
|
: "${DB_USER:=sa}"
|
||||||
|
: "${DB_PASSWORD:=YourStrong!Passw0rd}"
|
||||||
|
: "${DB_NAME:=CustomerDB}"
|
||||||
|
: "${SQLCMD_PATH:=sqlcmd}" # Path to the sqlcmd executable
|
||||||
|
|
||||||
|
# Path to the init script (relative to this script's location)
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
INIT_SQL="${SCRIPT_DIR}/init.sql"
|
||||||
|
|
||||||
|
if [[ ! -f "${INIT_SQL}" ]]; then
|
||||||
|
echo "❌ init.sql not found at ${INIT_SQL}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "🚀 Running database initialization..."
|
||||||
|
"${SQLCMD_PATH}" -S "${DB_SERVER}" -U "${DB_USER}" -P "${DB_PASSWORD}" -d "master" -Q "IF DB_ID(N'${DB_NAME}') IS NULL CREATE DATABASE ${DB_NAME};"
|
||||||
|
|
||||||
|
# Run the init script against the newly created database
|
||||||
|
"${SQLCMD_PATH}" -S "${DB_SERVER}" -U "${DB_USER}" -P "${DB_PASSWORD}" -d "${DB_NAME}" -i "${INIT_SQL}"
|
||||||
|
|
||||||
|
echo "✅ Database ${DB_NAME} initialized successfully."
|
||||||
@@ -1,14 +1,39 @@
|
|||||||
services:
|
services:
|
||||||
|
sql:
|
||||||
|
image: mcr.microsoft.com/mssql/server:2022-latest
|
||||||
|
container_name: sql
|
||||||
|
environment:
|
||||||
|
- ACCEPT_EULA=Y
|
||||||
|
- SA_PASSWORD=Ou812@12!@
|
||||||
|
ports:
|
||||||
|
- "1433:1433"
|
||||||
backend:
|
backend:
|
||||||
build:
|
build:
|
||||||
context: ./backend
|
context: ./backend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
depends_on:
|
||||||
|
- sql
|
||||||
container_name: backend
|
container_name: backend
|
||||||
environment:
|
environment:
|
||||||
- DB_SERVER=homelab.local
|
- DB_SERVER=sql
|
||||||
- DB_USER=sa
|
- DB_USER=sa
|
||||||
- DB_PASSWORD=Ou812@12!@
|
- DB_PASSWORD=Ou812@12!@
|
||||||
- DB_NAME=CustomerDB
|
- DB_NAME=CustomerDB
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
command: ./main
|
command: ./main
|
||||||
|
extra_hosts:
|
||||||
|
- "homelab.local:192.168.1.129"
|
||||||
|
|
||||||
|
init-db:
|
||||||
|
build:
|
||||||
|
context: ./db
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: init-db
|
||||||
|
depends_on:
|
||||||
|
- sql
|
||||||
|
environment:
|
||||||
|
- DB_SERVER=sql
|
||||||
|
- DB_USER=sa
|
||||||
|
- DB_PASSWORD=Ou812@12!@
|
||||||
|
- DB_NAME=CustomerDB
|
||||||
|
|||||||
Reference in New Issue
Block a user