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

我正在尝试在我的Docker镜像上安装nvm。 我原本以为这个Docker镜像是build立在Ubuntu上的,但它实际上是build立在Debian之上的。 我安装bashcurlNVM,并随后安装节点,但我得到一个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? 谢谢你的帮助。

Docker镜像基于Alpine Linux。 Alpine Linux使用默认shell作为sh 。 错误是因为shbash不兼容。

不幸的是,NVM主页提供了关于Alpine Linux的说明,但相当令人沮丧: Alpine Linux上的nvm

经过一番改动, 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每次需要使用它。

我build议尝试@BBitch更新的答案。

FROM docker将您的图像放在“ FROM docker ”高山形象。 除非你有一个需要Docker的Docker的特殊用例,否则这可能不是你想要的基础镜像。

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

如果您需要基于您的节点安装另一个版本的Debian或Ubuntu ,您可以从这些图像的多个版本中select,例如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