在Dockerfile中安装node?

83

我是AWS弹性Beanstalk的用户,遇到了一个小问题。我想用less+node构建我的CSS文件。但是我不知道如何在使用Jenkins构建时在我的dockerfile中安装node。

这是我在我的docker中使用的安装包。如果有任何建议,我将非常感激。

FROM php:5.6-apache


# Install PHP5 and modules along with composer binary
RUN apt-get update
RUN apt-get -y install \
    curl \
    default-jdk \
    git \
    libcurl4-openssl-dev \
    libpq-dev \
    libmcrypt-dev \
    libpq5 \
    npm \
    node \
    zlib1g-dev \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng12-dev

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/

RUN docker-php-ext-install curl json mbstring opcache pdo_mysql zip gd exif sockets mcrypt

# Install pecl
RUN pecl install -o -f memcache-beta \
    && rm -rf /tmp/pear \
    && echo 'extension=memcache.so' > /usr/local/etc/php/conf.d/memcache.ini

之后,我会使用以下代码运行我的entrypoint.sh文件

#!/usr/bin/env sh

composer run-script post-install-cmd --no-interaction

chmod 0777 -R /var/app/app/cache
chmod 0777 -R /var/app/app/logs

exec apache2-foreground

但是我遇到了这个错误

 Error Output: [2016-04-04 11:23:44] assetic.ERROR: The template ":tmp:module.html.twig" contains an error: A template that extends another one cannot have a body in ":tmp:module.ht  
  ml.twig" at line 7.     

但是当我以这种方式在 Docker 容器中安装 Node 时:

apt-get install git-core curl build-essential openssl libssl-dev
 git clone https://github.com/nodejs/node.git
 cd node
 ./configure
 make
 sudo make install
 node -v

我可以构建我的CSS,所以问题是...当我使用Jenkins构建Dockerfile时,如何使上面的安装程序在其中进行安装?


1
无论你想要实现什么目标,chmod 777 都是错误的危险的。在任何情况下,您绝对不希望将可执行文件或系统文件的写访问权限授予所有用户。您需要尽快恢复到正常的权限设置(对于您的用例,可能只需确保文件具有正确的所有者,并坚持使用 0755),并在再次尝试使用之前了解 Unix 权限模型。如果这发生在具有 Internet 访问权限的系统上,请检查是否有入侵者可以利用此来升级其特权。 - tripleee
12个回答

156

我认为这个效果稍微更好了一点。

ENV NODE_VERSION=16.13.0
RUN apt install -y curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
RUN node --version
RUN npm --version

请注意nvm 是一个用于管理 node.js 版本的工具,旨在每个用户中安装,并在每个 shell 中调用。nvm 在任何 POSIX 兼容的 shell(sh、dash、ksh、zsh、bash)上都可以使用,特别是在这些平台上:unix、macOS 和 windows WSL。


6
你为什么这样想? - Dawid Laszuk
3
这个答案似乎更好,因为它可以让你轻松地指定Node版本,并且使用nvm进行docker构建比在docker内部从源代码构建要快得多。 - Sam
2
添加速度信息:Nathaniel的回答在我停止构建之前花了5分钟。这个大约只用了15秒钟。 - Marek Židek
9
提供信息,如果有其他人想要将NVM_DIR放在非标准位置,则必须在“curl | bash”行之前添加ENV NVM_DIR=/somewhere-else/.nvm行,以便安装脚本能够识别。 - jdmcnair
3
这太棒了。只是一个小小的补充。如果ENV行说:ENV PATH="$NVM_DIR/versions/node/v${NODE_VERSION}/bin/:${PATH}",可能会更好。这样,如果您使用不同的*$NVM_DIR*,它就可以动态地更改路径。 - Magnus
显示剩余3条评论

37

apt-get install node命令并不能安装Node.js,因为这不是你所要求的包。

如果你运行apt-cache info node,你会发现你要安装的是一个“Amateur Packet Radio Node program (transitional package)”。

你应该按照Node.js安装说明通过包管理器进行安装。

或者,如果你喜欢从git构建,你可以在Docker中执行此操作:

RUN apt-get install -y git-core curl build-essential openssl libssl-dev \
 && git clone https://github.com/nodejs/node.git \
 && cd node \
 && ./configure \
 && make \
 && sudo make install

4
如果你想要更近期的答案,可以看下面这个链接:https://dev59.com/wVoV5IYBdhLWcg3wVNaZ#67491580。他/她/他们的想法也非常好,并且不需要使用 sudo,这可能在你的 Docker 镜像中不存在或不需要。 - Manfred

37
根据以下回答,我建议使用n包通过npm,这允许您选择nodejs版本,或使用latest标记或lts标记。例如:latest
RUN apt-get update && apt-get install -y \
    software-properties-common \
    npm
RUN npm install npm@latest -g && \
    npm install n -g && \
    n latest

4
好的回答!简洁明了,而且效果很好。很棒!要使用LTS,只需在答案中的代码片段中将“latest”替换为“lts”。 - Manfred
另一个小建议--根据你拥有的基础镜像,你可能需要安装curl或者wget来获取node二进制文件。apt-get install -y curl - Achintya Ashok
我遇到错误:0.379 节点:/lib/x86_64-linux-gnu/libm.so.6:找不到版本`GLIBC_2.27'(节点所需) 0.379 节点:/lib/x86_64-linux-gnu/libc.so.6:找不到版本`GLIBC_2.25'(节点所需) 0.379 节点:/lib/x86_64-linux-gnu/libc.so.6:找不到版本`GLIBC_2.28'(节点所需)实际上对于所有的解决方案我都遇到了这个错误 :) - mahdi
1
错误:引擎与您的node/npm版本不兼容:npm@10.1.0 - undefined

35

只有2行

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - 
RUN apt-get install -y nodejs

这行代码给我以下错误信息:debconf: 无法初始化前端界面:Dialog debconf:(未设置TERM,因此对话框前端无法使用。)debconf: 返回到前端:Readline debconf: 无法初始化前端界面:Readline debconf:(此前端界面需要控制tty。)debconf: 返回到前端:Teletype dpkg-preconfigure:无法重新打开标准输入: - alper
@alper 在你的Dockerfile中设置ARG DEBIAN_FRONTEND=noninteractive,这应该可以解决这个问题。 - Ani
它比@Nathan提供的接受答案更好吗?该答案先安装nvm吗? - AlexFreik
1
这个位于https://deb.nodesource.com/setup_X的脚本用于安装Node.js,现在已经过时,并最终将被停用。 - undefined

23
获取节点镜像并将其放置在 Dockerfile 的顶部:

获取节点镜像并将其放置在 Dockerfile 的顶部:

FROM node:[tag_name] AS [alias_name]

通过添加以下代码来验证版本:

RUN echo "NODE Version:" && node --version
RUN echo "NPM Version:" && npm --version

每次需要在容器中使用Node.js时,请添加以下代码:

COPY --from=[alias_name] . .

根据上面的代码,用以下内容替换:

[tag_name] - 您要使用的节点图像的标记值。访问https://hub.docker.com/_/node?tab=tags了解可用标记的列表。

[alias_name] - 您在dockerfile中要使用的首选映像名称。


示例:

FROM node:latest AS node_base

RUN echo "NODE Version:" && node --version
RUN echo "NPM Version:" && npm --version


FROM php:5.6-apache

COPY --from=node_base . .

### OTHER CODE GOES HERE

2
对我来说,使用 COPY --from=node_base . . 无法正常工作,而是需要使用 COPY --from=node_base / / - Hrvoje Golcic
2
错误:无法复制到非目录:/var/lib/docker/overlay2/oscikzv9ow4kfi4x1dmvw8dmn/merged/usr/include/mysql - Binh Ho
我认为这个解决方案更加优雅,而且对我来说也比安装nodejs少花了一些时间。 - ccoutinho
2
如果您只需要Node二进制文件,那么以下命令也可以正常工作:COPY --from=node:18.16.0-slim /usr/local/bin /usr/local/bin - veuncent
1
我还必须添加COPY --from=node:18.16.0-slim /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm,因为npm是符号链接到那个文件夹。 - Yonic Surny

18

无需编译即可进行二进制下载

FROM ubuntu

RUN apt-get update && apt-get install -y \
  ca-certificates \
  curl

ARG NODE_VERSION=14.16.0
ARG NODE_PACKAGE=node-v$NODE_VERSION-linux-x64
ARG NODE_HOME=/opt/$NODE_PACKAGE

ENV NODE_PATH $NODE_HOME/lib/node_modules
ENV PATH $NODE_HOME/bin:$PATH

RUN curl https://nodejs.org/dist/v$NODE_VERSION/$NODE_PACKAGE.tar.gz | tar -xzC /opt/

# comes with npm
# RUN npm install -g typescript

嗨,我喜欢你的方法,但它不兼容ARM芯片。 - Emanuel A.
1
Emanuel:使用正确的 ARM 二进制 URL:s/x64/arm64/ - Maryan

8

我正在使用以下Dockerfile来设置Node版本8.10.0。

在这里,我使用了NVM(Node Version Manager),因此我们可以选择在该容器上安装哪个Node版本。请在安装节点模块时使用npm的绝对路径(例如:/root/.nvm/versions/node/v${NODE_VERSION}/bin/npm install leasot@latest -g)。

   FROM ubuntu:18.04
   ENV NODE_VERSION=8.10.0
   RUN apt-get update && \
       apt-get install wget curl ca-certificates rsync -y
   RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
   ENV NVM_DIR=/root/.nvm
   RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
   RUN . "$NVM_DIR/nvm.sh" &&  nvm use v${NODE_VERSION}
   RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
   RUN cp /root/.nvm/versions/node/v${NODE_VERSION}/bin/node /usr/bin/
   RUN cp /root/.nvm/versions/node/v${NODE_VERSION}/bin/npm /usr/bin/
   RUN /root/.nvm/versions/node/v${NODE_VERSION}/bin/npm install  leasot@latest -g

注意:这是一个裁剪过的Dockerfile。

3

简短回答,例如安装v14.17.1版本

ENV PATH="/opt/node-v14.17.1-linux-x64/bin:${PATH}"
RUN curl https://nodejs.org/dist/v14.17.1/node-v14.17.1-linux-x64.tar.gz |tar xzf - -C /opt/ 

所有可用版本的列表可以在这里找到 -> https://nodejs.org/dist/

3

直接安装到/usr/local,这样它就已经在你的$PATH中了。

ARG NODE_VERSION=8.10.0
RUN curl https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz | tar -xz -C /usr/local --strip-components 1

2
被接受的答案提供了所有系统的安装说明链接,但是它不会直接运行,因为你通常(例如对于Ubuntu)没有安装所有必需的依赖项(即curlsudo)。
所以这里举例说明如何在Ubuntu上执行:
FROM ubuntu

# Core dependencies
RUN apt-get update && apt-get install -y curl sudo

# Node
# Uncomment your target version
# RUN curl -fsSL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# RUN curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash -
# RUN curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
# RUN curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
RUN sudo apt-get install -y nodejs
RUN echo "NODE Version:" && node --version
RUN echo "NPM Version:" && npm --version

然后构建(或编译)。
docker build . --progress=plain

查看echo语句的输出。当然,您也可以省略echo语句并使用“docker build .”定期运行它,在确保一切正常工作后进行操作。

您还可以省略安装sudo,但是那么您就必须摆脱脚本中的sudo出现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接