【问题标题】:Debian Image on Docker - How install NodejsDocker 上的 Debian 映像 - 如何安装 Nodejs
【发布时间】:2020-08-25 03:22:33
【问题描述】:

我正在编写 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?

找了半天不知道这个包为什么要安装,为什么不安装。

【问题讨论】:

  • 你好,2latlantik 有什么理由不使用官方的 docker 镜像为节点hub.docker.com/_/node 有一些基于 Debian,你为什么要做额外的工作?
  • 你好。我尝试学习在线课程网站提供的课程,这是课程的一个阶段。我从 docker 开始,我不是 linux 专家。
  • Ou ok,跟上然后伙计 :)
  • 最后一条命令... >/dev/null 2>&1的结尾显式丢弃所有输出;如果您删除这些修饰符,它应该会打印出实际的错误消息。
  • 我通过发布命令完成了我的问题

标签: node.js docker curl debian


【解决方案1】:

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

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

并尝试安装。 详情HERE

【讨论】:

  • 我试过了,但没用……我已经看过这个主题了。谢谢
【解决方案2】:

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

【讨论】:

  • 我真的想知道是不是我的虚拟机不好。我有dockertoolbox的基本配置
【解决方案3】:

希望这个答案可以帮助你。我实际上完成了基于实际的 nodejs docker 镜像制作 nodejs CentOs 镜像。如果你进入下一个链接,你可能会看到node docker image是如何构建的:

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 进程启动 node 的一个子进程,因此您必须通过进程来运行您的应用程序。
    2. npm 进程有一个已知(不太为人所知)的问题,称为:“PID 1 问题”。正如码头船长和顾问 Bret Fisher 在以下文章中所说:

      我建议直接调用节点二进制文件,主要是因为“PID 1 问题”... Node.js 接受并转发来自操作系统的 SIGINT 和 SIGTERM 等信号,这对于正确关闭应用程序很重要。 Node.js 让您的应用程序决定如何处理这些信号,这意味着如果您不编写代码或使用模块来处理它们,您的应用程序将不会正常关闭。它会忽略这些信号,然后在超时后被 Docker 或 Kubernetes 杀死。

      最好直接运行“node”二进制文件。正如文章中所说,npm 不处理 SIGTERM/SIGINIT 信号,node 也不处理它​​们。不同之处在于您可以在节点中添加代码来处理这些信号。

我包括了 node vs npm 问题,它出现在文章的最后一部分,它也有很多好的 nodejs docker 实践:)

keep nodejs rockin in decker

希望这可以帮助您解决疑虑,并帮助您进一步改进良好做法。如果您或任何人有任何疑问,请不要怀疑将其放在 cmets 上,如果可以,我将很乐意提供帮助。

祝你有美好的一天!

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 2021-12-19
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2020-10-20
    • 2019-04-16
    • 2017-05-10
    • 2016-09-08
    相关资源
    最近更新 更多