diff --git a/Dockerfile b/Dockerfile
index 003e4ea..9073dab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1 +1,18 @@
-# todo: Write Dockerfile
\ No newline at end of file
+FROM node:21
+
+# Install netcat
+RUN apt-get update && apt-get install -y netcat
+
+WORKDIR /usr/src/app
+
+# Copy package.json and package-lock.json to the working directory
+COPY package*.json ./
+
+RUN npm install pnpm
+RUN pnpm install
+
+COPY . .
+
+EXPOSE 4300
+
+ENTRYPOINT ["./entrypoint.sh"]
diff --git a/app.js b/app.js
index b2de95b..f76d2f7 100644
--- a/app.js
+++ b/app.js
@@ -14,10 +14,14 @@
 
 const express = require("express");
 const bodyParser = require("body-parser");
+const cookieParser = require("cookie-parser");
 const mysql = require("mysql2");
 const path = require("path");
-const dotenv = require("dotenv");
-dotenv.config();
+
+if (!process.env.DOCKER) {
+  const dotenv = require("dotenv");
+  dotenv.config();
+}
 
 //------------------------------------------------>
 // Express initialization & configuration
@@ -34,8 +38,9 @@ app.set("view engine", "ejs");
 // Middlewares
 //------------------------------------------------>
 
-// Use body-parser to get req.body
+// Use body-parser and cookie-parser
 app.use(bodyParser.urlencoded({ extended: false }));
+app.use(cookieParser());
 
 //------------------------------------------------>
 // MySQL connection
diff --git a/config/example.env b/config/example.env
new file mode 100644
index 0000000..210de1f
--- /dev/null
+++ b/config/example.env
@@ -0,0 +1,9 @@
+# Database
+DB_HOST="exampleHost"
+DB_PORT=3306
+DB_NAME="exampleName"
+DB_USER="exampleUser"
+DB_PASSWORD="examplePassword"
+
+# Express
+PORT=4300
\ No newline at end of file
diff --git a/config/placeholder b/config/placeholder
deleted file mode 100644
index e69de29..0000000
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..aa66a2c
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,37 @@
+version: '3'
+
+services:
+  # MySQL service
+  db:
+    image: mysql:8
+    restart: always
+    environment:
+      MYSQL_DATABASE: jet
+      MYSQL_USER: jet
+      MYSQL_PASSWORD: ghiuwe§825429h§$%ff
+      MYSQL_ROOT_PASSWORD: hgruwhgvuiwrghiuwe§825429h§$%ff
+    ports:
+      - "3306:3306"
+    volumes:
+      - mysql:/var/lib/mysql
+  
+  # Express app service
+  app:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    depends_on:
+      - db
+    ports:
+      - "4300:4300"
+    environment:
+      DB_HOST: db
+      DB_PORT: 3306
+      DB_USER: jet
+      DB_PASSWORD: ghiuwe§825429h§$%ff
+      DB_NAME: jet
+      DOCKER: true
+      PORT: 4300
+
+volumes:
+  mysql:
\ No newline at end of file
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 0000000..2f46014
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+set -e
+
+# Function to check if the database is healthy
+check_database() {
+  until nc -z -w 1 "$DB_HOST" "$DB_PORT"; do
+    >&2 echo "[JET] Waiting for MySQL to be ready..."
+    sleep 1
+  done
+  >&2 echo "[JET] MySQL is ready"
+}
+
+# Check if the database is healthy
+check_database
+
+# Start the Express app
+exec npm run start
diff --git a/example-compose.yml b/example-compose.yml
new file mode 100644
index 0000000..f631f5e
--- /dev/null
+++ b/example-compose.yml
@@ -0,0 +1,37 @@
+version: '3'
+
+services:
+  # MySQL service
+  db:
+    image: mysql:8
+    restart: always
+    environment:
+      MYSQL_DATABASE: exampleDatabaseName
+      MYSQL_USER: exampleUser
+      MYSQL_PASSWORD: examplePassword
+      MYSQL_ROOT_PASSWORD: exampleRootPassword
+    ports:
+      - "3306:3306"
+    volumes:
+      - mysql:/var/lib/mysql
+  
+  # Express app service
+  app:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    depends_on:
+      - db
+    ports:
+      - "4300:4300"
+    environment:
+      DB_HOST: db
+      DB_PORT: 3306
+      DB_USER: exampleUser
+      DB_PASSWORD: examplePassword
+      DB_NAME: exampleDatabaseName
+      DOCKER: true
+      PORT: 4300
+
+volumes:
+  mysql:
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index dff1a79..2ce63b4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
       "license": "MIT",
       "dependencies": {
         "body-parser": "^1.20.2",
+        "cookie-parser": "^1.4.6",
         "dotenv": "^16.3.1",
         "ejs": "^3.1.9",
         "express": "^4.18.2",
@@ -510,6 +511,26 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/cookie-parser": {
+      "version": "1.4.6",
+      "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
+      "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
+      "dependencies": {
+        "cookie": "0.4.1",
+        "cookie-signature": "1.0.6"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/cookie-parser/node_modules/cookie": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
     "node_modules/cookie-signature": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
diff --git a/package.json b/package.json
index 311d9ab..b4813cd 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
   "license": "MIT",
   "dependencies": {
     "body-parser": "^1.20.2",
+    "cookie-parser": "^1.4.6",
     "dotenv": "^16.3.1",
     "ejs": "^3.1.9",
     "express": "^4.18.2",