If you're just here to copy and paste, here's the final Dockerfile that will produce an image for your Express.js app:
FROM node:22.10.0-alpine.3.19
LABEL maintainer="jonas@sliplane.io"
WORKDIR /app
COPY package* ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
And here's the .dockerignore file you should use:
node_modules
npm-debug.log
To build and run the image, use these commands:
docker build -t express-app .
docker run -p 3000:3000 express-app
Not just here to copy and paste? Let's go over what's happening in the Dockerfile!
The Setup
For this tutorial, I assume you have an Express.js project set up. Express.js is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications. If you have a different setup, you might need to adjust the Dockerfile accordingly.
Typically, you'd run npm install
and then node index.js
to work locally. For deployment, we'll use a similar approach but within a Docker container.
Let's dive into the details of the Dockerfile.
The Dockerfile
FROM node:22.10.0-alpine.3.19
LABEL maintainer="jonas@sliplane.io"
WORKDIR /app
COPY package* ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
So what's happening here?
- Base image:
- Uses Node.js 22.10.0 on Alpine 3.19, providing a lightweight base image.
- The
LABEL
instruction adds metadata to the image.
- Working directory:
- Sets up
/app
as the working directory for subsequent instructions.
- Sets up
- Dependency installation:
- Copies
package.json
andpackage-lock.json
(if it exists) to the working directory. - Runs
npm install
to install dependencies.
- Copies
- Application code:
- Copies the rest of the application code into the container.
- Port exposure:
- Exposes port 3000, which is typically used by Express.js applications.
- Start command:
- Specifies the command to run the application using
node index.js
.
- Specifies the command to run the application using
This approach is simpler than the multi-stage build we used for Astro, as Express.js applications typically don't require a separate build step.
Make sure to add the .dockerignore
file to ignore the node_modules
folder and npm debug logs. This will speed up the build process and reduce the image size.
Deployment
You can deploy this Docker container to any cloud provider that supports Docker. For example, you could use platforms like Heroku, DigitalOcean, or AWS ECS. Because I am the co-founder of Sliplane, I will show you how to deploy it there.
After signing up, you can create a new service by selecting your Github Repository. Then just keep the default settings and click on deploy.
After deployment, your Express.js app will be available under a subdomain of sliplane.app, usually it's just your service name.
You can also see the logs of your app, see metrics such as CPU and memory usage, add persistent storage, and much more. Whenever you push to your repository, Sliplane will automatically deploy your app.
If you want to try out Sliplane, the first 2 days are free! Try it out and let me know what you think :)
Deploy ExpressJS in 2 Minutes 🚀
Next Steps
Is there anything else you want to know? Do you need help dockerizing your Express.js app? Do you need help deploying it to a specific platform? Feel free to reach out!
You can find me on X or just comment here on this blog.
Cheers,
Jonas