0

I have a problem when create pdf using html-pdf. In my local running well but in server can't work. my code below:

const fileName = './public/offering/' + dayjs().format('YYYY-MM-DD') + '-' + name[0] + '.pdf';

const htmlToPdfOptions = {
     type: 'PDF',
     height: '1200px',
     width: '816px',
     renderDelay: 2000,
     format: 'Letter',
     phantomPath: require('requireg')('phantomjs-prebuilt').path,
};
pdf.create(file, htmlToPdfOptions).toFile(fileName, async function (err: any, result: any) {
   if (err) return console.log(err, 'xxxxxxxxxxxxxx this error');
   console.log(result)
});

in my docker like this

FROM node:14-alpine

RUN npm install --global pm2

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .

COPY package*.json ./
COPY . .

RUN npm install && npm run build

RUN npm install -g phantomjs --unsafe-perm

COPY . .

EXPOSE 8500

CMD ["pm2-runtime", "start", "src/index.js"]

Error in server is

Error: spawn /usr/src/app/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs ENOENT
     at Process.ChildProcess._handle.onexit (internal/child_process.js:269:19)
     at onErrorNT (internal/child_process.js:467:16)
     at processTicksAndRejections (internal/process/task_queues.js:82:21) {
   errno: -2,
   code: 'ENOENT',
   syscall: 'spawn /usr/src/app/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs',
   path: '/usr/src/app/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs',
   spawnargs: [
     '--local-url-access=false',
     '/usr/src/app/node_modules/html-pdf/lib/scripts/pdf_a4_portrait.js'
   ]
 }

Can anyone help me? because I have already tried some solutions on the web but nothing works or anyone can give me reference?. example: Nodejs + PhantomJS in Docker: Error: spawn - ENOENT

zainal abidin
  • 363
  • 1
  • 3
  • 12
  • 1
    Why `COPY . .` three times? Are you installing dependencies and then overwriting the whole folder (and deleting dependencies)? – jabaa Mar 16 '22 at 06:52

1 Answers1

0

Your Dockerfile has some strange copie commands. This should solve your problem

FROM node:14-alpine

RUN npm install --global pm2

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .

RUN npm install && npm run build

RUN npm install -g phantomjs --unsafe-perm

EXPOSE 8500

CMD ["pm2-runtime", "start", "src/index.js"]

You should also add node_modules to your .dockerignore file.

jabaa
  • 5,844
  • 3
  • 9
  • 30
  • I already tried but the error is still the same. Does this error occur because it is not in the docker file? – zainal abidin Mar 16 '22 at 07:21
  • @zainalabidin Have you rebuilt the image? The error message means that the file can't be found. The reason could be missing dependencies. In your Dockerfile you are installing dependencies and overwriting the whole folder. – jabaa Mar 16 '22 at 07:31