To create a docker-compose.yaml
file that sets up MongoDB and an email service, we can use Docker containers for MongoDB and a Node.js application that connects to MongoDB and sends emails. For the email service, we can use Nodemailer with a transport service like SendGrid or Mailgun.
Here’s how you can create the docker-compose.yaml
and necessary files:
Step 1: Create the docker-compose.yaml
File
Create a file named docker-compose.yaml
with the following content:
version: '3.8'
services:
mongo:
image: mongo:latest
container_name: mongo
ports:
- '27017:27017'
volumes:
- mongo-data:/data/db
node-app:
build: .
container_name: node-app
ports:
- '3000:3000'
depends_on:
- mongo
environment:
- MONGO_URI=mongodb://mongo:27017/your_database_name
- NODE_ENV=development
- SMTP_HOST=smtp.your-email-provider.com
- SMTP_PORT=587
- SMTP_USER=your-email@example.com
- SMTP_PASS=your-email-password
volumes:
mongo-data:
Step 2: Create the Dockerfile
Create a file named Dockerfile
in the same directory with the following content to set up the Node.js application:
# Use the official Node.js image.
FROM node:14
# Create and change to the app directory.
WORKDIR /usr/src/app
# Copy application dependency manifests to the container image.
COPY package*.json ./
# Install dependencies.
RUN npm install
# Copy the local code to the container image.
COPY . .
# Run the web service on container startup.
CMD [ "node", "index.js" ]
Step 3: Create the Node.js Application
Create a file named index.js
with the following content to connect to MongoDB and send emails:
const mongoose = require('mongoose');
const nodemailer = require('nodemailer');
const express = require('express');
const bodyParser = require('body-parser');
require('dotenv').config();
// Express setup
const app = express();
app.use(bodyParser.json());
// MongoDB connection
const mongoURI = process.env.MONGO_URI;
mongoose.connect(mongoURI, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('Successfully connected to MongoDB'))
.catch(err => console.error('Error connecting to MongoDB:', err));
// Nodemailer setup
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: false, // true for 465, false for other ports
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
// Endpoint to send email
app.post('/send-email', (req, res) => {
const { to, subject, text } = req.body;
const mailOptions = {
from: process.env.SMTP_USER,
to,
subject,
text,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return res.status(500).send(error.toString());
}
res.status(200).send('Email sent: ' + info.response);
});
});
// Start the server
const port = 3000;
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
Step 4: Create the .env
File
Create a file named .env
to store environment variables for your application:
MONGO_URI=mongodb://mongo:27017/your_database_name
SMTP_HOST=smtp.your-email-provider.com
SMTP_PORT=587
SMTP_USER=your-email@example.com
SMTP_PASS=your-email-password
Step 5: Create the package.json
File
Create a file named package.json
to define your Node.js project and its dependencies:
{
"name": "node-docker-app",
"version": "1.0.0",
"description": "Node.js app with MongoDB and Nodemailer",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"body-parser": "^1.19.0",
"dotenv": "^16.0.0",
"express": "^4.17.1",
"mongoose": "^5.12.3",
"nodemailer": "^6.6.3"
}
}
Step 6: Build and Run the Docker Containers
In your terminal, navigate to the directory containing the docker-compose.yaml
file and run:
docker-compose up --build
This command will build the Node.js application container, start MongoDB and the Node.js application, and set up the necessary environment variables.
Your Node.js application should now be able to connect to MongoDB and send emails using Nodemailer.