我正在尝试在我的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?谢谢你的帮助。
答案 0 :(得分:1)
Docker镜像基于Alpine Linux。 Alpine Linux使用默认shell作为sh
。该错误是由于sh
与bash
不兼容造成的。
不幸的是,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。
如果您需要在节点的基础上安装另一个版本的Debian或Ubuntu,则可以从这些图片的多个版本中进行选择,例如: 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