如何在Dockerfile中运行bash函数
我在如何在Dockerfile中运行bash函数,bash,docker,Bash,Docker,我在/root/.profile中定义了一个bash函数nvmdocker build在RUN步骤中调用该函数时,未能找到该函数 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 && \
/root/.profile
中定义了一个bash函数nvm
<代码>docker build在RUN
步骤中调用该函数时,未能找到该函数
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
我设法调用了nvm
,方法是用bash-ic
包装它,它将加载/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
并使其可执行:
chmod +x script.sh
在Dockerfile put中:
RUN /path/to/script.sh
运行bash-c'nvm安装0.12&&nvm别名默认值0.12&&nvm使用0.12'
应该可以做到这一点。对你有用吗?(我不是100%确定,因为我不知道您的容器的详细外观)它工作正常。但我正在寻找更好的解决方案。好的,检查我的答案。shell脚本是最干净的方法。到目前为止,您还没有接受我的答案。你说更好的解决方案是什么意思?不是为Docker设计的。你真的想在一个容器中包含两个Node.js吗?我需要在一些不同的步骤中运行nvm。我认为当命令被格式化为多行时,bash-c
的正确引用很难控制。这就是我建议使用shell脚本的原因。我不明白为什么需要多个脚本。你能详细说明一下吗?一旦我得到它,我可能会提出一些建议。这不是我从中得到的:“RUN
(shell形式,命令在shell中运行,在Linux上默认为/bin/sh-c
,在Windows上默认为cmd/S/c
).是的,我不确定这个答案是否正确…我的印象是每个RUN
命令都在子shell中执行其内容。
RUN /path/to/script.sh