Образ Debian на Docker - Как установить Nodejs - PullRequest
0 голосов
/ 09 мая 2020

Я пишу Dockerfile для запуска nodejs на сервере debian, но компиляция не может быть выполнена. Файл dockerfile выглядит следующим образом:

FROM debian:9

RUN apt-get update -yq \
   && apt-get install curl gnupg -yq \
   && curl -sL https://deb.nodesource.com/setup_10.x | bash \
   && apt-get install nodejs -yq \
   && apt-get clean -y

ADD . /app/
WORKDIR /app
RUN npm install

EXPOSE 2368
VOLUME /app/logs

CMD npm run start

Я выполняю следующие инструкции шаг за шагом

docker run --rm -it debian:latest

apt-get update

apt-get clean 

apt-get install curl gnupg -yq

curl -sL https://deb.nodesource.com/setup_12.x | bash

Последняя строка пытается установить пакет lsb-release, но возникает ошибка. Появляются следующие строки:

+ apt-get install -y lsb-release > /dev/null 2>&1
Error executing command, exiting

Я выполняю команду

apt-get install -y lsb-release

Последние строки:

Failed to fetch http://deb.debian.org/debian/pool/main/p/python3-defaults/python3-minimal_3.7.3-1_amd64.deb  Bad header line Bad header data [IP: 151.101.122.133 80]
E: Failed to fetch http://deb.debian.org/debian/pool/main/p/python3.7/python3.7_3.7.3-2+deb10u1_amd64.deb  Bad header line Bad header data [IP: 151.101.122.133 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Я долго искал, но не знать, почему этот пакет хочет установить и почему он не устанавливается.

Ответы [ 3 ]

0 голосов
/ 09 мая 2020

Ваш Dockerfile теперь отлично работает для меня на двух разных машинах. Возможно возникла проблема с сервером. IP теперь другой

curl -v http://deb.debian.org/debian/pool/main/p/python3-defaults/python3-minimal_3.7.3-1_amd64.deb -o test
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 151.101.246.133:80...
* Connected to deb.debian.org (151.101.246.133) port 80 (#0)
0 голосов
/ 14 мая 2020

надеюсь, что этот ответ может вам помочь. Я фактически выполнил создание изображения nodejs CentOs на основе фактического изображения nodejs docker. Если вы перейдете по следующей ссылке, вы увидите, как создается изображение узла docker:

узел docker официальное изображение

Первая часть узла image запускает команды для создания пользователя «узла», и я не могу не подчеркнуть, насколько хорошо с точки зрения безопасности выполняется запуск ваших контейнеров узлов от другого пользователя, который не является «root». Вторая часть - это та часть, которая, я верю, поможет вам; Во всем этом коде у вас есть часть, в которой вы обмениваетесь ключами gpg с сервером, и сразу после этого, в зависимости от вашей архитектуры, программа nodejs загружается с официальной страницы nodejs и готовится к запуску. Я думаю, что ваша основная проблема заключается не в импорте ключей на сервер, там на изображении вы должны найти ответ.

Кроме того, на изображении есть часть, отвечающая за определение вашей архитектуры, но в основном большинство архитектуры будут "x64". Я включаю вам образ узла на основе CentOs (на основе официального образа узла, который я связал с вами), чтобы вы могли его посмотреть:

FROM centos:centos8

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --shell /bin/bash --create-home node

# node install taken from the node oficial image
ENV NODE_VERSION=12.16.3

RUN set -ex \
    && for key in \
       94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
       FD3A5288F042B6850C66B31F09FE44734EB7990E \
       71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
       DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
       C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
       B9AE9905FFD7803F25714661B63B535A4C206CA9 \
       77984A986EBC2AA786BC0F66B01FBB92821C587A \
       8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
       4ED778F539E3634C779C87C6D7062848A1AB005C \
       A48C2BEE680E841632CD4E44F07496B3EB3C1762 \
       B9E2F5981AA6E0CD28160D9FF13993A75599653C \
     ; do \
       gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \
       gpg --batch --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \
       gpg --batch --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \
     done \
     && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
     && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
     && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
     && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
     && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
     && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
     && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
     # smoke tests
     && node --version \
     && npm --version

CMD [ "node" ]

ДРУГАЯ ИНФОРМАЦИЯ Здесь я хочу дать вам к другим пунктам, которые могут вам помочь в вашем Dockerfile, но не отвечайте прямо на ваш ответ (поэтому я поставил его до конца):

  1. Я могу полагать, что у вас есть свои причины, но официальный образ nodejs docker на самом деле основан на debian (если вы не выберете alpine), поэтому вы можете решить свою проблему напрямую, используя FROM nodejs:<version_you_want>. Повторяю, может быть, у вас есть веская причина так поступать, но дать совет не помешает :)

  2. Это не считается хорошей практикой (я поставлю ссылку после этого абзаца на ссылку), чтобы использовать «npm» для запуска образа узла по следующим причинам:

    1. Процесс npm запускает подпроцесс узла, поэтому вы должны обрабатывать для запуска вашего приложения.
    2. Процесс npm имеет известную (не очень известную) проблему, которая называется: «Проблема PID 1». Как Брет Фишер, капитан и консультант docker, заявляет в следующей статье:

      Я рекомендую вызывать двоичный файл узла напрямую, в основном из-за «проблемы PID 1» ​​... Node.js принимает и пересылает такие сигналы, как SIGINT и SIGTERM, из ОС, что важно для правильного завершения работы вашего приложения. Node.js оставляет на усмотрение вашего приложения, как обрабатывать эти сигналы, а это означает, что если вы не пишете код или не используете модуль для их обработки, ваше приложение не завершится корректно. Он проигнорирует эти сигналы, а затем будет уничтожен Docker или Kubernetes после периода ожидания.

      Лучше запускать двоичный файл «node» напрямую. Как сказано в статье, npm не обрабатывает сигналы SIGTERM / SIGINIT, и узел также не обрабатывает их. Разница в том, что вы можете добавить код в узел для обработки этих сигналов.

Я включаю проблему node vs npm, она входит в последнюю часть статья, и в ней также есть много хороших nodejs docker практик :)

держать nodejs рок в палубе

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

Хорошего дня!

0 голосов
/ 09 мая 2020

Возможно, у вас устаревшие исходные PPA.

sudo rm -rf /var/lib/apt/lists/*
sudo rm -rf /etc/apt/sources.list.d/*
sudo apt-get update

и попробуйте установить. Подробности ЗДЕСЬ

...