如何在Dockerfile中通过FOSS安装Node.js?Ubuntu镜像构建报错求助
问题
我正尝试基于Ubuntu为代码仓库构建Docker镜像,当前Dockerfile内容如下:
FROM harbor.global.lmco.com/lmc.eo.swf.efoss/ubuntu-22.04:v1.11.3 FROM node:8.2 FROM ubuntu:18.04 # WORKDIR / ARG EFOSS_USER ARG EFOSS_TOKEN ARG http_proxy=http://proxy-zsgov.global.lmco.com:80 ARG https_proxy=http://proxy-zsgov.global.lmco.com:80 ARG no_proxy=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG HTTP_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG HTTPS_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG NO_PROXY=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt RUN efoss apt-get install --yes --no-install-recommends
运行脚本时出现错误:
Step 15/15 : RUN efoss apt-get install --yes --no-install-recommends ---> Running in 3d8deda25bd4 /bin/sh: 1: efoss: not found The command '/bin/sh -c efoss apt-get install --yes --no-install-recommends' returned a non-zero code: 127 Cleaning up project directory and file based variables 00:00 ERROR: Job failed: exit code 127
我还尝试过RUN apt-get install nodejs、RUN apt-get install node.js等指令,但均未成功。
注:eFoss是可搜索的集中式FOSS仓库,所有员工无需业务审批即可使用已获批开源软件。
解决方案
核心问题拆解
- 多FROM指令覆盖基础镜像:Dockerfile里连续用了三个
FROM,最终只会以最后一个ubuntu:18.04作为基础镜像,前面的EFOSS维护版Ubuntu和Node.js镜像都会被直接忽略——这就是efoss命令找不到的根本原因,因为纯净Ubuntu镜像里没装这个工具。 - 纯净Ubuntu无法访问EFOSS仓库:直接用
apt-get安装失败,是因为默认源不是EFOSS的仓库,公司内部环境下无法通过公网源获取软件。
修复步骤
1. 修正基础镜像,保留EFOSS维护的Ubuntu
删掉多余的FROM指令,只留EFOSS提供的镜像作为基础,确保能使用efoss工具:
FROM harbor.global.lmco.com/lmc.eo.swf.efoss/ubuntu-22.04:v1.11.3
如果需要Node.js环境,不要用第二个FROM,而是通过efoss命令安装。
2. 确保efoss命令正常使用
EFOSS维护的镜像应该预装了efoss客户端,直接用它来更新源并安装软件即可:
# 更新EFOSS源缓存 RUN efoss update # 安装Node.js(可指定版本,比如efoss apt-get install nodejs=8.2.*) RUN efoss apt-get install --yes --no-install-recommends nodejs
3. 保留代理与证书配置
原有的代理和证书ARG配置要保留,确保能正常访问内部EFOSS仓库:
ARG EFOSS_USER ARG EFOSS_TOKEN ARG http_proxy=http://proxy-zsgov.global.lmco.com:80 ARG https_proxy=http://proxy-zsgov.global.lmco.com:80 ARG no_proxy=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG HTTP_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG HTTPS_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG NO_PROXY=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
4. 完整修复后的Dockerfile示例
FROM harbor.global.lmco.com/lmc.eo.swf.efoss/ubuntu-22.04:v1.11.3 ARG EFOSS_USER ARG EFOSS_TOKEN ARG http_proxy=http://proxy-zsgov.global.lmco.com:80 ARG https_proxy=http://proxy-zsgov.global.lmco.com:80 ARG no_proxy=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG HTTP_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG HTTPS_PROXY=http://proxy-zsgov.global.lmco.com:80 ARG NO_PROXY=".lmco.com,.us.lmco.com,.lmms.lmco.com,.ssc.lmco.com,.gitlab.us.lmco.com,.pages.gitlab.us.lmco.com,.us-gov-west-1.amazonaws.com" ARG REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ARG SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt WORKDIR /app RUN efoss update && \ efoss apt-get install --yes --no-install-recommends nodejs
额外提示
- 如果需要特定版本的Node.js(比如8.2),可以在安装时指定版本号,格式为
efoss apt-get install nodejs=8.2.*,具体版本号可通过EFOSS仓库查询。 - 不要随意在Dockerfile里多次使用
FROM,除非是明确的多阶段构建场景,否则只会保留最后一个镜像的内容,前面的镜像都会被丢弃。
内容的提问来源于stack exchange,提问作者patricia lomber
相关产品推荐
相关产品推荐

