Установка NodeJS на Docker - PullRequest
       19

Установка NodeJS на Docker

1 голос
/ 08 марта 2019

Я пытаюсь запустить свое приложение в Docker.Одна из библиотек, которую я использую: https://www.npmjs.com/package/odbc. Чтобы установить эту библиотеку, мне нужно выполнить требования, описанные в файле readme odbc:

  • бинарные файлы unixODBC и библиотеки разработки для компиляции модулей
    • в Ubuntu / Debian sudo apt-get установить unixodbc unixodbc-dev
    • в RedHat / CentOS sudo yum установить unixODBC unixODBC-devel
  • драйверы odbc дляцелевая база данных
  • , правильно настроенные odbc.ini и odbcinst.ini.

Согласно документу Microsoft для установки драйвера ODBC 13 для SQL Server https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017#ubuntu-1604-1 Мне удаетсяустановить все компоненты локально на моем Mac и успешно подключиться к SQL Server в Azure, но все еще возникают некоторые проблемы с их установкой на Docker, а затем запустить на VSTS.Мой Dockerfile:

FROM ubuntu:16.04
USER root
RUN apt-get update
RUN apt-get install --yes curl
RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
RUN apt-get install --yes nodejs
RUN apt-get install --yes build-essential
RUN apt-get install -y npm 
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y build-essential
RUN apt-get install -y make
RUN apt-get install apt-transport-https
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql unixodbc-dev
ADD . /var/www/app
WORKDIR /var/www/app
RUN npm install && \
    npm cache clean --force
RUN npm run build 
EXPOSE 3000:80
CMD ["npm", "start"]

Но до сих пор есть проблема с установкой NodeJS в соответствии с

RUN curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -

Ошибка: /bin/sh: 1: sudo: not found Я пытался установить только драйвер и для установки NodeJsпросто используйте несколько существующих образов Docker:

FROM ubuntu:16.04
USER root
RUN apt-get update
RUN apt-get install --yes curl
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y build-essential
RUN apt-get install -y make
RUN apt-get install apt-transport-https
RUN apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql unixodbc-dev

FROM node:9-alpine
ADD . /var/www/app
WORKDIR /var/www/app
RUN npm install && \
    npm cache clean --force
RUN npm run build 
EXPOSE 3000:80

Но такой подход приводит к ошибке:

gyp ERR! configure error 
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
gyp ERR! stack     at PythonFinder.failNoPython (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:483:19)
gyp ERR! stack     at PythonFinder.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:397:16)
gyp ERR! stack     at F (/usr/local/lib/node_modules/npm/node_modules/which/which.js:68:16)
gyp ERR! stack     at E (/usr/local/lib/node_modules/npm/node_modules/which/which.js:80:29)
gyp ERR! stack     at /usr/local/lib/node_modules/npm/node_modules/which/which.js:89:16
gyp ERR! stack     at /usr/local/lib/node_modules/npm/node_modules/which/node_modules/isexe/index.js:42:5
gyp ERR! stack     at /usr/local/lib/node_modules/npm/node_modules/which/node_modules/isexe/mode.js:8:5
gyp ERR! stack     at FSReqWrap.oncomplete (fs.js:170:21)
gyp ERR! System Linux 4.9.125-linuxkit
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "build"
gyp ERR! cwd /var/www/app/node_modules/odbc
gyp ERR! node -v v9.11.2
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok 
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.7: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! odbc@1.4.5 install: `node-gyp configure build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the odbc@1.4.5 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-03-08T20_51_17_496Z-debug.log

1 Ответ

2 голосов
/ 09 марта 2019

Вы работаете с изображением ubuntu:16.04 и, по сути, делаете много работы, которую ребята из NodeJS уже сделали.

Я бы пошел на изображение node:10-stretch-slim на вашем месте.Затем установите необходимые драйверы с помощью apt-get (если доступно, в противном случае загрузите сценарий и установите его в Dockerfile).

Команда sudo обычно не устанавливается на образы докера, посколькупользователь по умолчанию root в сеансах контейнера.Если вы видите какие-либо ошибки, связанные с sudo, вы можете просто удалить sudo из командной строки, которая вызывает проблему.

Возможное решение

Обновление моегоответ здесь, с возможным решением для вас.

Это решение поместит ваше приложение в образ узла 10, основанный на Debian Stretch 9. Он получит драйверы базы данных для вас из репозитория Debian 9 Microsoft и установит все пакеты, которые вы видите.требуя от вашего вопроса.

Я также добавил ENTRYPOINT и CMD в нижней части скрипта.Но эти строки - догадки, поскольку в вашем вопросе ничего не говорится о том, как вы на самом деле запускаете свое приложение.(Если вы добавите это, я обновлю свой ответ).

Примечание. Обратите внимание, что я передаю --host 0.0.0.0 команде npm run start.Это сделано для того, чтобы избежать привязки живого сервера к локальному хосту, что сделает недоступным извне контейнера.Если вы не запустите контейнер с --network="host".

У вас может быть другое средство запуска приложения, которое более «продуктивно», чем живой сервер разработки.Если это так, просто замените строки в нижней части Dockerfile, или спросите меня об этом ответе.

Dockerfile

# from debian stretch 9.8, node 10
FROM node:10-stretch-slim

# get apt-transport-https, etc., so that we can install by https protocol
RUN apt-get update \
 && apt-get install -y \
      apt-transport-https \
      build-essential \
      make

# add and accept the microsoft signature
RUN curl -q https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
# retrieve the microsoft packagelist for debian 9
RUN curl -q https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list

# install the ms odbc sql driver and unixodbc header stuff
RUN apt-get update \
 && ACCEPT_EULA=Y apt-get install -y \
      msodbcsql17 \
      unixodbc-dev \
 && rm -rf /var/lib/apt/lists

# expose port 80 in containers of this image
EXPOSE 80

# copy working directory into the image and set as pwd
ADD . /var/www/app
WORKDIR /var/www/app

# install dependencies for the application
RUN npm install \
 && npm cache clean --force

# build the application
RUN npm run build

# i am just guessing how you want your app started here, npm?
ENTRYPOINT ["npm"]
# and then this, which makes "npm run start --host 0.0.0.0"
CMD ["run", "start", "--host", "0.0.0.0"]

Постройте изображениес помощью:

docker build -t mynodeapp:0.1 .

Запустите образ приложения с помощью:

docker run -p 3000:80 --name mynodeapp mynodeapp:01

Наконец, посетите: http://localhost:3000, чтобы увидеть, как оно работает.

...