Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Dockerfile中运行bash函数_Bash_Docker - Fatal编程技术网

如何在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