我在 /root/.profile
中定义了一个 bash 函数 nvm
。当我在 RUN
步骤中调用该函数时,docker build
找不到该函数。
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
关于bash - 如何在 Dockerfile 中运行 bash 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707839/