【问题标题】:Install node in Dockerfile?在 Dockerfile 中安装节点?
【发布时间】:2016-07-23 19:53:53
【问题描述】:

我是 AWS elastic 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

在此之后,我正在使用代码运行我的 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 容器节点中时

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 中进行安装?

【问题讨论】:

    标签: node.js amazon-web-services jenkins docker less


    【解决方案1】:

    我认为这会更好一些。

    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 is a version manager for node.js,设计为按用户安装,并按外壳调用。 nvm 适用于任何 POSIX 兼容的 shell(sh、dash、ksh、zsh、bash),尤其是在以下平台上:unix、macOS 和 windows WSL。

    【讨论】:

    • 你为什么这么认为?
    • 这似乎是一个更好的答案,因为它可以让您轻松指定 Node 版本,并且使用 nvm 构建 docker 比在 docker 中从源代码构建要快得多
    • 添加速度有多快:Nathaniel 的回答在我退出构建尝试这个之前花了 5 分钟。这个耗时大约 15 秒。
    • 仅供参考,对于想要将 NVM_DIR 放在某个非标准位置的任何其他人,ENV NVM_DIR=/somewhere-else/.nvm 行必须位于“curl | bash”行之前,以便受到安装脚本的尊重。
    • 仅供参考,NVM_DIR 给出了路径不存在的错误。所以我在curl 行之前有mkdir 路径
    【解决方案2】:

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

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

    你应该关注the Node.js install instructions通过包管理器安装。

    或者,如果您喜欢从 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
    

    【讨论】:

    • 如果您正在寻找更新的答案,请查看以下stackoverflow.com/a/67491580/411428 他/她/他们的想法也可以正常工作,并且不需要您可能不想要的sudo或者在你的 docker 镜像中。
    【解决方案3】:

    根据following 的答案,我建议通过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
    

    【讨论】:

    • 很好的答案!简而言之,它确实有效。好的!要使用 LTS,只需在答案的代码 sn-p 中将 latest 替换为 lts
    【解决方案4】:

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

    FROM node:[tag_name] AS [alias_name]
    

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

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

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

    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
    

    【讨论】:

    • 对我来说,它不适用于COPY --from=node_base . .,而是COPY --from=node_base / /
    • 错误:cannot copy to non-directory: /var/lib/docker/overlay2/oscikzv9ow4kfi4x1dmvw8dmn/merged/usr/include/mysql
    【解决方案5】:

    只有两行

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

    【讨论】:

      【解决方案6】:

      我正在使用以下 Dockerfile 来设置节点版本 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。

      【讨论】:

        【解决方案7】:

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

        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:使用正确的 arm 二进制 url:s/x64/arm64/
        【解决方案8】:

        简短的回答,例如安装 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/

        【讨论】:

          【解决方案9】:

          接受的答案提供了installation instructions for all systems 的链接,但它不会开箱即用,因为您经常(例如对于 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

          【讨论】:

            【解决方案10】:

            直接进入/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
            

            【讨论】:

              猜你喜欢
              • 2021-07-30
              • 1970-01-01
              • 1970-01-01
              • 2015-06-07
              • 1970-01-01
              • 2017-12-07
              • 1970-01-01
              • 2018-04-13
              • 1970-01-01
              相关资源
              最近更新 更多