Я пытаюсь запустить свое приложение в Docker. Одна из библиотек, которые я использую, — https://www.npmjs.com/package/odbc. Чтобы установить эту библиотеку, мне нужно выполнить требования, описанные в файле readme odbc:
В соответствии с документом 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
Я тоже пытался это сделать, но как мне установить этот драйвер MS ODBC? Мне нужно использовать apt-get для его установки. docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/…
официальный образ узла докера основан на Debian, поэтому вы можете использовать apt-get как хотите
поэтому я должен иметь возможность использовать: FROM node:9-alpine RUN apt-get update RUN apt-get install --yes curl, но получение /bin/sh: apt-get: не найдено
о, мне нужно либо использовать FROM: node: 10, чтобы иметь возможность использовать apt-get, либо node: 10-alpine, а затем нужно использовать apk вместо apt-get





Вы работаете над изображением 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/Packages Ошибка записи в выходной файл — запись (28: На устройстве не осталось места) Ошибка записи в файл — запись (28: На устройстве не осталось места)
Это странно — я просто взял точный код из Dockerfile в своем ответе и построил его без каких-либо проблем. А потом я снова построил его с помощью docker build --no-cache -t node:01 . — вы можете попробовать скопировать код еще раз и попробовать еще раз?
Предыдущий комментарий я решил. Можно установить все на 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
Это новый вопрос? Я не думаю, что это связано с исходным вопросом? Возможно, это лучше всего объясняется в новом. Вы можете поместить туда больше данных, чем вы комментируете, и объяснить, когда это происходит?
Спасибо за помощь. Я открою новый вопрос о драйвере ODBC.
Почему
FROM ubuntu:16.04, а не что-то вродеFROM node:8? Не уверен, что полностью понимаю вашу мотивацию создания собственного образа Node с нуля.