Docker上的Debian映像-如何安装Node.js

时间:2020-05-09 14:26:52

标签: node.js docker curl debian

我正在编写一个Dockerfile在Debian服务器上运行nodejs,但是无法完成编译。 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 :(得分:0)

可能是因为您的PPA源已过时。

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

,然后尝试安装。 详细信息HERE

答案 1 :(得分:0)

您的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)

答案 2 :(得分:0)

希望这个答案可能对您有帮助。我实际上是根据实际的nodejs docker映像完成了一个nodejs CentOs映像的制作。如果您输入下一个链接,则可能会看到如何构造节点docker映像:

node docker oficial 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问题”。正如布雷特·费舍尔(Bret Fisher),这是码头工人的船长和顾问在以下文章中指出:

      我建议直接调用节点二进制文件,这主要是由于“ PID 1问题” ... Node.js从OS接收并转发诸如SIGINT和SIGTERM之类的信号,这对于正确关闭应用程序很重要。 Node.js将其留给您的应用程序来决定如何处理这些信号,这意味着,如果您不编写代码或使用模块来处理这些信号,则您的应用程序将无法正常关闭。它会忽略这些信号,然后在超时后被Docker或Kubernetes杀死。

      更好的做法是直接运行“节点”二进制文件。如文章所述,npm不处理SIGTERM / SIGINIT信号,node也不处理它​​们。区别在于您可以在节点中添加代码以处理这些信号。

我包括了节点vs npm问题,它出现在本文的最后部分,并且它还具有许多很好的nodejs docker做法:)

keep nodejs rockin in decker

希望这可以帮助您解决疑虑,并且可以帮助您更多地改善良好做法。如果您或任何人有任何疑问,请不要在评论中提出疑问,如果可以的话,我们将很乐意为您提供帮助。

祝你有美好的一天!