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

Я пытаюсь запустить свое приложение в 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. Мой докерфайл:

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 Я пытался установить только драйвер, а для установки NodeJ просто использовал некоторые существующие образы 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: [email protected] (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: `node-gyp configure build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] 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

Почему FROM ubuntu:16.04, а не что-то вроде FROM node:8? Не уверен, что полностью понимаю вашу мотивацию создания собственного образа Node с нуля.

Max 08.03.2019 22:05

Я тоже пытался это сделать, но как мне установить этот драйвер MS ODBC? Мне нужно использовать apt-get для его установки. docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/…

camel 08.03.2019 22:11

официальный образ узла докера основан на Debian, поэтому вы можете использовать apt-get как хотите

Thomasleveil 08.03.2019 22:23

поэтому я должен иметь возможность использовать: FROM node:9-alpine RUN apt-get update RUN apt-get install --yes curl, но получение /bin/sh: apt-get: не найдено

camel 08.03.2019 22:28

о, мне нужно либо использовать FROM: node: 10, чтобы иметь возможность использовать apt-get, либо node: 10-alpine, а затем нужно использовать apk вместо apt-get

camel 08.03.2019 22:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
5 808
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы работаете над изображением 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://локальный: 3000, чтобы увидеть, как это работает.

Я получаю длинную ошибку W: в репозитории «deb.debian.org/debian stretch Release» нет файла Release. W: В репозитории «security.debian.org/debian-security stretch/updates Release» нет файла Release. W: В репозитории «deb.debian.org/debian stretch-updates Release» нет файла Release. E: Не удалось получить deb.debian.org/debian/dists/stretch/main/binary-amd64/Packag‌​es Ошибка записи в выходной файл — запись (28: На устройстве не осталось места) Ошибка записи в файл — запись (28: На устройстве не осталось места)

camel 09.03.2019 22:23

Это странно — я просто взял точный код из Dockerfile в своем ответе и построил его без каких-либо проблем. А потом я снова построил его с помощью docker build --no-cache -t node:01 . — вы можете попробовать скопировать код еще раз и попробовать еще раз?

Andreas Lorenzen 09.03.2019 23:06

Предыдущий комментарий я решил. Можно установить все на Docker, но все еще есть проблема с драйвером ODBC: unixODBC][Диспетчер драйверов]Не удается открыть lib\'/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.3.so.1.1\‌​ ' : файл не найден, но на самом деле он установлен: root@e1995a781ac6:/var/www/app# odbcinst -j unixODBC 2.3.7 ДРАЙВЕРЫ............: /etc/odbcinst.ini СИСТЕМА ИСТОЧНИКИ ДАННЫХ: /etc/odbc.ini ИСТОЧНИКИ ДАННЫХ ФАЙЛА..: /etc/ODBCDataSources ИСТОЧНИКИ ДАННЫХ ПОЛЬЗОВАТЕЛЯ..: /root/.odbc.ini Размер SQLULEN......: 8 Размер SQLLEN..... ...: 8 SQLSETPOSIROW Размер.: 8

camel 09.03.2019 23:12

Это новый вопрос? Я не думаю, что это связано с исходным вопросом? Возможно, это лучше всего объясняется в новом. Вы можете поместить туда больше данных, чем вы комментируете, и объяснить, когда это происходит?

Andreas Lorenzen 10.03.2019 00:14

Спасибо за помощь. Я открою новый вопрос о драйвере ODBC.

camel 10.03.2019 10:30

Другие вопросы по теме