oransel / node-talib

A technical analysis library for node.js
GNU Lesser General Public License v3.0
904 stars 149 forks source link

Error in Docker Alpine TA_AVGDEV_Lookback: symbol not found #85

Closed micheledisalvatore closed 4 years ago

micheledisalvatore commented 4 years ago

Hi guys. I'm trying to run a simple node app with this library running in docker, but at the startup of the container, an error occurs in TALIB and the app stops running.

This is the error

Error: Error relocating /app/node_modules/talib/build/Release/talib.node: TA_AVGDEV_Lookback: symbol not found
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1188:18

And the Dockerfile I'm using

FROM node:14-alpine

RUN mkdir /app
WORKDIR /app
COPY . /app

RUN apk add --update python make g++

RUN yarn install --production --ignore-optional

CMD node .

Am I missing any dependency in my docker file?

Thank you for your help.

micheledisalvatore commented 4 years ago

I've replaced node:14-alpine with node:14 and it works, but the image size jumped from 485MB (alpine) to 1.09GB (generic node), it would be great to know what libraries are required to run TALIB

oransel commented 4 years ago

I am not familiar with Alpine. May be you are missing node-gyp.

micheledisalvatore commented 4 years ago

@oransel thank you for your help, I've tried adding it RUN apk add --no-cache --virtual .gyp python make g++ gcc but keeping the same error... if you have any other idea, please let me know, I'll check it out.

korniychuk commented 4 years ago

@micheledisalvatore I found a workaround. Multi staging Dockerfile. We can make a build via node-slim and then copy files to alpine. Here is the base version of the Dockerfile.
The total size of the image with my app is 260MB (alpine)

#
# ================ base-install-env ================
#
FROM node:14.5-slim as base-install-env

WORKDIR /code

RUN set -x && \
  apt-get update && \
  apt-get install -y \
          apt-transport-https \
          build-essential \
          make \
          python

#
# ================ app-env ================
#
FROM base-install-env as app-env

COPY ./package.json ./yarn.lock /code/

RUN set -x && \
    yarn global add ts-node node-prune modclean --loglevel=warn && \
    yarn install --production --loglevel=warn && \
    node-prune && \
    modclean -r -n default:safe

#
# ================ builder-env ================
#
FROM app-env as builder-env

RUN set -x && \
    yarn install --loglevel=warn

#
# ================ build ================
#
FROM builder-env as build

COPY ./tsconfig.json /code/
COPY ./src /code/src

RUN npm run build:prod

#
# ================ app ================
#
FROM node:14.5-alpine as app
WORKDIR /code

COPY ./package.json /code/
COPY --from=build /code/dist /code/dist
COPY --from=app-env /code/node_modules /code/node_modules

EXPOSE 3000
CMD ["npm", "run", "start:prod", "main"]
korniychuk commented 4 years ago

After manual deleting trash, I've achieved 179MB 🧨

    rm -rf node_modules/rxjs/src/ && \
    rm -rf node_modules/rxjs/bundles/ && \
    rm -rf node_modules/rxjs/_esm5/ && \
    rm -rf node_modules/rxjs/_esm2015/ && \
    rm -rf node_modules/typescript/ && \
    rm -rf node_modules/@types/ && \
    rm -rf node_modules/talib/src/ && \
    rm -rf node_modules/typeorm/browser/ && \
    rm -rf node_modules/ccxt/dist/ && \
    find node_modules -type f -name "*.ts" -delete && \
    find node_modules -type f -name "*.spec.*" -delete && \
    find node_modules -type f -name "*.test.*" -delete && \
    find node_modules -type d -name "__tests__" -delete
micheledisalvatore commented 4 years ago

@korniychuk wow a great achievement! Thank you for sharing