在使用Dockerfile的Ubuntu镜像中安装特定版本的node.js和npm

7

我想知道怎样更新我的自定义Dockerfile来安装Node v6.3.1和NPM v3.10.6,同时不破坏其中已有的内容。

目前这是我的自定义文件:

FROM         ubuntu:16.10

MAINTAINER   Fátima Alves

COPY         . /my-software
WORKDIR        /my-software

RUN          apt-get update          \
                                  && \
             apt-get install -y      \
               python-dev            \
             tesseract-ocr

谢谢!


更新

目前我的dockerfile内容如下:

FROM         ubuntu:16.10

MAINTAINER   Fátima Alves

COPY         ./dist            /my-software
COPY         ./s3-config.json  /my-software
COPY         ./_*              /my-software
COPY         ./node_modules    /my-software
WORKDIR                        /dataextractor

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

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

并返回:

The command '/bin/sh -c curl -sL https://deb.nodesource.com/setup_6.x | bash -             && apt-get install -y nodejs' returned a non-zero code: 1

也许我漏掉了什么?
2个回答

6
您只需按照通常的Ubuntu安装说明,在您的Dockerfile的RUN语句中执行即可。
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get install -y nodejs

Docs


我应该把这个放在第一次运行之后吗? - user5526811
是的。如果你想要,你可以使用 && 将它们放在同一条语句中,但我建议现在将它们分开。 - Guy
啊抱歉,您在 curl 命令后不需要使用管道符号到 sudo。在 Docker 中您已经被设置为根用户。已更新上述命令。 - Guy
一秒钟,让我试试这个。 - user5526811
现在我无法测试它,因为我正在工作。也许只尝试&&之前的第一部分,看看是否有效,如果是,则知道问题在于第二部分等。另一个尝试的方法是将它们作为单独的命令: RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - RUN apt-get install -y nodejs - Guy
7
有没有办法安装与8.9.4版本完全相同的版本?在上述情况下,我们只需要主要版本。我想在我的容器中安装一个特定的节点版本。 - Sourav Prem

1

为什么

因为https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions建议使用“curl管道bash”反模式,让我们尝试使其更加简洁。

什么

由于容器是从确定的操作系统和版本构建的,我们不需要那个bash脚本的通用性。

如何

如果我们仔细查看https://deb.nodesource.com/setup_6.x,我们会发现它只为Debian执行了两件事情:

  1. 通过apt-key add他们的公钥添加到apt的密钥链中
  2. 将他们的deb repo添加到新创建的文件/etc/apt/sources.list.d/nodesource.list

添加来源

第二件事我们可以非常容易地完成。那就是在你的Dockerfile中简单地加入以下内容:

2nd thing指的是:

COPY nodesource.list  /etc/apt/sources.list.d/nodesource.list

当然,您需要创建一个类似以下内容的nodesource.list:
deb     https://deb.nodesource.com/node_6.x trusty main
deb-src https://deb.nodesource.com/node_6.x trusty main

添加可信任密钥

第一件事对于新手来说有点棘手。我宁愿将一个密钥链文件添加到/etc/apt/trusted.gpg.d/,而不是修改现有的/etc/apt/trusted.gpg文件(这就是apt-key add所做的)。他们在https://deb.nodesource.com/gpgkey/nodesource.gpg.key的URL上拥有的是公钥,而不是密钥链。为了获得密钥链文件,我们可以像这样进行管道传输[而不是使用apt-key]:

curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | \
gpg --import --no-default-keyring --keyring ./nodesource.gpg

这将创建nodesource.gpg,我们可以通过将其放入您的Dockerfile中来利用:

COPY nodesource.gpg   /etc/apt/trusted.gpg.d/nodesource.gpg

按照通常方式安装

我使用疯狂的间距和以\结尾的行,是因为我倾向于安装许多其他包。

# Install software packages
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq && apt-get clean
RUN apt-get install -qqy \
                         nodejs \
    && \
    apt-get clean

您可以在https://gist.github.com/RichardBronosky/f748563dc328b12b39cd864973fcb138#file-dockerfile中查看完整的Dockerfile。


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