我正在编写一个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?
我已经搜索了很长时间,但不知道为什么要安装此软件包,为什么不安装。
答案 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映像:
节点映像的第一部分运行命令来创建一个“节点”用户,我不能十分强调安全实践如何从不是“ 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,但不要直接回答您的答案(这就是为什么我将其放在最底端)的原因:
我可能会相信您有原因,但是官方的nodejs docker镜像实际上是基于debian的(除非您选择alpine),因此您可以使用FROM nodejs:<version_you_want>
直接解决您的问题。我再说一遍,也许您有充分的理由这样做,但是提出建议并没有什么坏处:)
由于以下原因,使用“ npm”启动节点图像不是一种好习惯(我将在本段之后的链接添加到参考文献中)
npm进程有一个已知(未知)问题,称为:“ PID 1问题”。正如布雷特·费舍尔(Bret Fisher),这是码头工人的船长和顾问在以下文章中指出:
我建议直接调用节点二进制文件,这主要是由于“ PID 1问题” ... Node.js从OS接收并转发诸如SIGINT和SIGTERM之类的信号,这对于正确关闭应用程序很重要。 Node.js将其留给您的应用程序来决定如何处理这些信号,这意味着,如果您不编写代码或使用模块来处理这些信号,则您的应用程序将无法正常关闭。它会忽略这些信号,然后在超时后被Docker或Kubernetes杀死。
更好的做法是直接运行“节点”二进制文件。如文章所述,npm不处理SIGTERM / SIGINIT信号,node也不处理它们。区别在于您可以在节点中添加代码以处理这些信号。
我包括了节点vs npm问题,它出现在本文的最后部分,并且它还具有许多很好的nodejs docker做法:)
希望这可以帮助您解决疑虑,并且可以帮助您更多地改善良好做法。如果您或任何人有任何疑问,请不要在评论中提出疑问,如果可以的话,我们将很乐意为您提供帮助。
祝你有美好的一天!