How to create your own Dockerfile for a rapid Dokku deployment
Dokku is good, and I wrote a blog for whole setup of Dokku + Node + React + MongoDB. This blog, we will address the issue where if you use the default buildpack
for building, it will download Node and NPM everytime, which will make it very long in some circumstance, in this blog, we will Dockerfile
to replace it, make it much more faster, because we will multi-stage build
with its cache mechanism.
1. What is the requirement
The environment is still the same:
- Node: back-end
- React.js: Front-end
- MongoDB: Database
- Dokku: Container
The folder structure looks like this:
—-root
——–client
——–public
- root: back-end code
- client: front-end code
- public: folder for holding all the static assets
The React.js
is powered by create-react-app
, for each deployment, we need to build the client, then it will yield a build
folder, we need to replace the top level public
with this build
folder, so we can serve it from our back-end. It is actually quite simple.
2. Dockerfile
Create a dockerfile in the root folder.
1 | # 1. build the front-end |
2.1 build the front-end
This part is pretty easy to understand. We use 10-alpine
here for the base, because it’s small and fast. Then We create a new folder /temp-build
in the container, then copy the package.json
and package-lock.json
there, and npm install
, then we copy the whole folder over, and start building. The interesting part is AS
, we name our stage as build-react
, so we can refer to it later.
2.2 prepare the back-end
Here, we still use 10-alpine
, we create a new folder, we still do the same steps, copy packages*.json
, then install
, copy folder, swap public
with build
with this command: COPY --from=build-react /temp-build/build/ /myApp/public/
.
2.3 run this web-application
We expose 3030, then set the production, and run npm run start
at last.
3. End
It is just that easy. Hope it helps.
Thanks for reading!
Follow me (albertgao) on twitter, if you want to hear more about my interesting ideas.