在Dockerfile中安装节点?

Del*_*ium 8 less amazon-web-services node.js jenkins docker

我是AWS弹性beanstalk的用户,我有一点问题.我想用less + node构建我的CSS文件.但是在使用jenkins构建时,我不知道如何在dockerfile中安装节点.

这是我在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
Run Code Online (Sandbox Code Playgroud)

在此之后,我运行我的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
Run Code Online (Sandbox Code Playgroud)

但后来我遇到了这个错误

 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.     
Run Code Online (Sandbox Code Playgroud)

但是当我以这种方式在Docker容器节点内部安装时

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
Run Code Online (Sandbox Code Playgroud)

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

小智 66

我认为这稍微好一点。

ENV NODE_VERSION=12.6.0
RUN apt install -y curl
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.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
Run Code Online (Sandbox Code Playgroud)

请注意nvm 是 node.js 的版本管理器,旨在为每个用户安装,并为每个 shell 调用。nvm 适用于任何符合 POSIX 的 shell(sh、dash、ksh、zsh、bash),特别是在这些平台上:unix、macOS 和 windows WSL。

  • 仅供参考,对于想要将 NVM_DIR 放在某个非标准位置的其他人,“ENV NVM_DIR=/somewhere-else/.nvm”行必须位于“curl | bash”行之前,以便安装脚本尊重。 (5认同)
  • 你为什么这么认为? (3认同)
  • 这似乎是一个更好的答案,因为它可以让您轻松指定 Node 版本,并且使用 nvm 进行 docker 构建比在 docker 中从源代码构建要快得多 (3认同)
  • 这太棒了。只是一个小补充。如果 ENV 行显示:`ENV PATH="$NVM_DIR/versions/node/v${NODE_VERSION}/bin/:${PATH}"` 可能会更好。这样,如果您使用不同的 *$NVM_DIR*,它会动态更改路径。 (3认同)
  • 添加速度:纳撒尼尔的回答花了 5 分钟,然后我退出构建来尝试这个。这一次大约花了 15 秒。 (2认同)

gia*_*pnh 36

只需 2 行

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - 
RUN apt-get install -y nodejs
Run Code Online (Sandbox Code Playgroud)

  • 此脚本位于 https://deb.nodesource.com/setup_X,用于安装 Node.js,现已弃用,最终将变得不活动。 (3认同)

Nat*_*rot 11

Running apt-get install node 不会安装Node.js,因为那不是你要求的包.

如果你运行apt-cache info node你可以看到你正在安装的是"业余分组无线节点程序(过渡包)"

您应该按照Node.js安装说明通过软件包管理器进行安装.

或者如果你喜欢从git构建,你可以在Docker中做到这一点:

RUN 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
Run Code Online (Sandbox Code Playgroud)

  • 如果您正在寻找更新的答案,请看看下面的这个 /sf/answers/4724410631/ 他/她/他们的想法也很好,并且不需要您可能需要的“sudo”不想要或不包含在您的 docker 映像中。 (3认同)

小智 8

获取节点图像并将其放在 dockerfile 的顶部:

FROM node:[tag_name] AS [alias_name]
Run Code Online (Sandbox Code Playgroud)

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

RUN echo "NODE Version:" && node --version
RUN echo "NPM Version:" && npm --version
Run Code Online (Sandbox Code Playgroud)

然后每次需要在容器中使用 nodejs 时添加以下代码:

COPY --from=[alias_name] . .
Run Code Online (Sandbox Code Playgroud)


从上面的代码中,将以下内容替换为:

[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
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它不适用于 `COPY --from=node_base 。.`,而是使用 `COPY --from=node_base //` (2认同)
  • 错误:`无法复制到非目录:/var/lib/docker/overlay2/oscikzv9ow4kfi4x1dmvw8dmn/merged/usr/include/mysql` (2认同)
  • 如果您只想要节点二进制文件,这也有效:`COPY --from=node:18.16.0-slim /usr/local/bin /usr/local/bin` (2认同)

Mar*_*yan 6

二进制下载,无需任何编译

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
Run Code Online (Sandbox Code Playgroud)


Sij*_*ril 5

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

这里我使用了NVM(节点版本管理器),因此我们可以选择应该在该容器上安装哪个节点版本。安装节点模块时请使用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
Run Code Online (Sandbox Code Playgroud)

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


lor*_*isi 5

根据以下答案,我建议使用npmvian包,它可以让您选择 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
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!简短、切中要害,而且效果很好。好的!要使用 LTS,只需在答案的代码片段中将“latest”替换为“lts”即可。 (2认同)