From 36c7e1a3c326af46b50bc9c2fc2b732ee85a6cf6 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 11 Mar 2022 23:55:57 +0100 Subject: [PATCH] feat: Install pnpm into docker image if pnpm lock file is used --- src/lib/buildPacks/nestjs.ts | 6 ++++++ src/lib/buildPacks/nextjs.ts | 9 ++++++++- src/lib/buildPacks/node.ts | 9 ++++++++- src/lib/buildPacks/nuxtjs.ts | 9 ++++++++- src/lib/components/templates.ts | 2 +- src/lib/docker.ts | 6 +++++- 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/lib/buildPacks/nestjs.ts b/src/lib/buildPacks/nestjs.ts index 38ef3bce1..b30c5ecd9 100644 --- a/src/lib/buildPacks/nestjs.ts +++ b/src/lib/buildPacks/nestjs.ts @@ -4,13 +4,19 @@ import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { const { applicationId, tag, port, startCommand, workdir, baseDirectory } = data; const Dockerfile: Array = []; + const isPnpm = startCommand.includes('pnpm'); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); Dockerfile.push(`LABEL coolify.image=true`); + if (isPnpm) { + Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); + Dockerfile.push('RUN pnpm add -g pnpm'); + } Dockerfile.push( `COPY --from=${applicationId}:${tag}-cache /usr/src/app/${baseDirectory || ''} ./` ); + Dockerfile.push(`EXPOSE ${port}`); Dockerfile.push(`CMD ${startCommand}`); await fs.writeFile(`${workdir}/Dockerfile`, Dockerfile.join('\n')); diff --git a/src/lib/buildPacks/nextjs.ts b/src/lib/buildPacks/nextjs.ts index 15e6dacca..c8d16dab6 100644 --- a/src/lib/buildPacks/nextjs.ts +++ b/src/lib/buildPacks/nextjs.ts @@ -13,7 +13,10 @@ const createDockerfile = async (data, image): Promise => { pullmergeRequestId } = data; const Dockerfile: Array = []; - + const isPnpm = + installCommand.includes('pnpm') || + buildCommand.includes('pnpm') || + startCommand.includes('pnpm'); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); Dockerfile.push(`LABEL coolify.image=true`); @@ -32,6 +35,10 @@ const createDockerfile = async (data, image): Promise => { } }); } + if (isPnpm) { + Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); + Dockerfile.push('RUN pnpm add -g pnpm'); + } Dockerfile.push(`COPY ./${baseDirectory || ''}package*.json ./`); try { await fs.stat(`${workdir}/yarn.lock`); diff --git a/src/lib/buildPacks/node.ts b/src/lib/buildPacks/node.ts index 15e6dacca..c8d16dab6 100644 --- a/src/lib/buildPacks/node.ts +++ b/src/lib/buildPacks/node.ts @@ -13,7 +13,10 @@ const createDockerfile = async (data, image): Promise => { pullmergeRequestId } = data; const Dockerfile: Array = []; - + const isPnpm = + installCommand.includes('pnpm') || + buildCommand.includes('pnpm') || + startCommand.includes('pnpm'); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); Dockerfile.push(`LABEL coolify.image=true`); @@ -32,6 +35,10 @@ const createDockerfile = async (data, image): Promise => { } }); } + if (isPnpm) { + Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); + Dockerfile.push('RUN pnpm add -g pnpm'); + } Dockerfile.push(`COPY ./${baseDirectory || ''}package*.json ./`); try { await fs.stat(`${workdir}/yarn.lock`); diff --git a/src/lib/buildPacks/nuxtjs.ts b/src/lib/buildPacks/nuxtjs.ts index 15e6dacca..c8d16dab6 100644 --- a/src/lib/buildPacks/nuxtjs.ts +++ b/src/lib/buildPacks/nuxtjs.ts @@ -13,7 +13,10 @@ const createDockerfile = async (data, image): Promise => { pullmergeRequestId } = data; const Dockerfile: Array = []; - + const isPnpm = + installCommand.includes('pnpm') || + buildCommand.includes('pnpm') || + startCommand.includes('pnpm'); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); Dockerfile.push(`LABEL coolify.image=true`); @@ -32,6 +35,10 @@ const createDockerfile = async (data, image): Promise => { } }); } + if (isPnpm) { + Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); + Dockerfile.push('RUN pnpm add -g pnpm'); + } Dockerfile.push(`COPY ./${baseDirectory || ''}package*.json ./`); try { await fs.stat(`${workdir}/yarn.lock`); diff --git a/src/lib/components/templates.ts b/src/lib/components/templates.ts index f09272634..1b2e7346d 100644 --- a/src/lib/components/templates.ts +++ b/src/lib/components/templates.ts @@ -13,7 +13,7 @@ export function findBuildPack(pack, packageManager = 'npm') { if (pack === 'node') { return { ...metaData, - installCommand: null, + ...defaultBuildAndDeploy(packageManager), buildCommand: null, startCommand: null, publishDirectory: null, diff --git a/src/lib/docker.ts b/src/lib/docker.ts index 477491f12..a202649e2 100644 --- a/src/lib/docker.ts +++ b/src/lib/docker.ts @@ -16,6 +16,7 @@ export async function buildCacheImageWithNode(data, imageForBuild) { secrets, pullmergeRequestId } = data; + const isPnpm = installCommand.includes('pnpm') || buildCommand.includes('pnpm'); const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageForBuild}`); Dockerfile.push('WORKDIR /usr/src/app'); @@ -35,7 +36,10 @@ export async function buildCacheImageWithNode(data, imageForBuild) { } }); } - // TODO: If build command defined, install command should be the default yarn install + if (isPnpm) { + Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); + Dockerfile.push('RUN pnpm add -g pnpm'); + } if (installCommand) { Dockerfile.push(`COPY ./${baseDirectory || ''}package*.json ./`); try {