I chose to use npm as the package manager in the beginning as usual. But, I have changed it into pnpm and migrated it to this project since I was curious what it is like - pnpm is different from npm and could break the build system. In production, we definitely make sure to test it properly to swtich.
I had to change Docker script for it was written for npm. Let me break down the Dockerfile that I have implemented.
For those who might read this article without reading the previous articles, You can find the whole backend code here
Development stage
Installing pnpm
is added to the script by writing RUN wget -qO /bin/pnpm "https://github.com/pnpm/pnpm/releases/latest/download/pnpm-linuxstatic-x64" && chmod +x /bin/pnpm
.
Notice that instead of install, fetch is used for loading packages and it only requires pnpm-lock.yaml
file - I reason that pnpm fetch
is equivalent to npm ci
when you use npm
for the build.
According to the official document of pnpm, pnpm fetch
and pnpm install --offline
will save so much time.
Lastly, since we use Prisma in the application, we should add RUN pnpm exec prisma generate
to generate prisma client.
Build stage
We can now copy node_modules
folder created from the development stage. I have also copied .env file since it has some information when running the application.
Finally by using --prod
flag for installing packages after the build, Only production packages will be installed.
Production stage
In the production stage, we will simply copy node_modules
and dist
folders created from the build stage and then run the application.
Once you enter the command docker build -t [image-name-you-want-give] -f Dockerfile .
to build an image, the image will be created and you can see how fast it is created and how light it is - You can build an image without implementing multi-stage build to compare.
THANKS FOR READING. SEE YOU NEXT TIME!