错误的替换错误在基于Debian的Docker镜像中安装NVM

时间:2016-08-07 16:01:56

标签: linux bash docker debian dockerfile

我正在尝试在我的Docker镜像上安装nvm。我原本以为这个Docker镜像是在Ubuntu上构建的,但实际上是在Debian上构建的。我正在安装bash以卷曲NVM,然后安装节点,但我收到bad substitution错误:

这是我的Dockerfile:

FROM docker

RUN apk add --update bash \
  && touch /root/.bashrc \
  && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash \
  && source /root/.bashrc \
  && nvm install node \
  && npm install

我认为以下错误与行&& source /root/.bashrc \

有关
=> Downloading nvm as script to '/root/.nvm'

0
=> Appending source string to /root/.bashrc
=> Close and reopen your terminal to start using nvm
/bin/sh: /root/.nvm/nvm.sh: line 107: syntax error: bad substitution
ERROR: Service 'docker' failed to build: The command '/bin/sh -c apk add --update bash   && touch /root/.bashrc   && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash   && source /root/.bashrc   && nvm install node   && npm install' returned a non-zero code: 2

您是否看到导致此错误替换错误的原因,是否有更简单的方法在基于Debian的Docker映像上安装nvm?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Docker镜像基于Alpine Linux。 Alpine Linux使用默认shell作为sh。该错误是由于shbash不兼容造成的。

不幸的是,NVM主页上有关于Alpine Linux的说明,但非常令人沮丧: nvm on Alpine Linux

经过一些更改后,制作nvm work with Alpine的最终版本:

FROM docker
RUN apk add --update bash coreutils ncurses tar gzip nodejs \
  && touch ~/.bashrc \
  && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | sh \
  && LINE=$(cat /root/.nvm/nvm.sh | grep -in '{BASH_SOURCE\[0\]}' | awk -F: '{print $1}') \
  && sed -i "${LINE}s/BASH_SOURCE\[0\]\}/BASH_SOURCE\}\$\{0\}/" /root/.nvm/nvm.sh \ 
  && source ~/.bashrc \
  && nvm ls \
  && nvm install node \
  && nvm use --delete-prefix v6.3.1 \
  && npm install

有点不方便,每次需要使用时都需要使用nvm use --delete-prefix v6.3.1

我建议尝试@BMitch的更新答案。

答案 1 :(得分:0)

FROM docker将您的图像基于Docker中的#34; Docker"高山图像。除非你有一个特殊的用例需要Docker中的Docker,否则这可能不是你想要的基本图像。

如果您想要节点图像,请考虑使用premade node image。这是基于Debian jessie。

如果您需要在节点的基础上安装另一个版本的DebianUbuntu,则可以从这些图片的多个版本中进行选择,例如: FROM debian:jessie

编辑:将Docker添加到另一个图像非常容易。以下是基于Debian的映像的Dockerfile条目(appuser是一个添加到其他地方的用户,容器通常会运行,因此添加了Docker组):

ARG DOCKER_GID=999
USER root
RUN curl -sSL https://get.docker.com/ | sh
RUN groupmod -g ${DOCKER_GID} docker && \
    usermod -aG docker appuser