如何在Dockerfile中运行bash函数

我在nvm定义了一个bash函数/root/.profile 。 当我在RUN步骤中调用它时, docker build没能find那个函数。

 RUN apt-get install -y curl build-essential libssl-dev && \ curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh RUN nvm install 0.12 && \ nvm alias default 0.12 && \ nvm use 0.12 

错误是

 Step 5 : RUN nvm install 0.12 ---> Running in b639c2bf60c0 /bin/sh: nvm: command not found 

我设法通过用bash -ic包装它来调用nvm ,这会加载/root/.profile

 RUN bash -ic "nvm install 0.12" && \ bash -ic "nvm alias default 0.12" && \ bash -ic "nvm use 0.12" 

上面的方法工作正常,但它有一个警告

 bash: cannot set terminal process group (1): Inappropriate ioctl for device bash: no job control in this shell 

我想知道是否有一个更容易和更干净的方式直接调用bash函数,因为它是正常的二进制没有bash -ic包装? 也许类似

 RUN load_functions && \ nvm install 0.12 && \ nvm alias default 0.12 && \ nvm use 0.12 

Docker的RUN不会在shell中启动该命令。 这就是为什么shell函数和shell语法(如cmd1 && cmd2 )不能用于开箱即用的原因。 你需要明确地调用shell:

 RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12' 

如果您害怕这么长的命令行,请将这些命令放入一个shell脚本中,并使用RUN调用脚本:

script.sh

 #!/bin/bash nvm install 0.12 && \ nvm alias default 0.12 && \ nvm use 0.12 

并使其可执行:

 chmod +x script.sh 

在Dockerfile中放入:

 RUN /path/to/script.sh