如何在Dockerfile中运行bash函数

Qua*_*ong 9 bash docker

我有一个nvm定义的bash函数/root/.profile.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
Run Code Online (Sandbox Code Playgroud)

错误是

Step 5 : RUN nvm install 0.12
 ---> Running in b639c2bf60c0
/bin/sh: nvm: command not found
Run Code Online (Sandbox Code Playgroud)

我设法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"
Run Code Online (Sandbox Code Playgroud)

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

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

我想知道是否有一种更简单,更简洁的方法来直接调用bash函数,因为它是普通的二进制文件而没有bash -ic包装?也许是这样的

RUN load_functions && \
    nvm install 0.12 && \
    nvm alias default 0.12 && \
    nvm use 0.12
Run Code Online (Sandbox Code Playgroud)

hek*_*mgl 6

Docker RUN不会在shell中启动命令.这就是为什么shell函数和shell语法(比如cmd1&& cmd2)无法开箱即用的原因.您需要显式调用shell:

RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12'
Run Code Online (Sandbox Code Playgroud)

如果您害怕那个长命令行,请将这些命令放入shell脚本并使用以下命令调用脚本RUN:

script.sh

#!/bin/bash

nvm install 0.12 && \
nvm alias default 0.12 && \
nvm use 0.12
Run Code Online (Sandbox Code Playgroud)

并使其可执行:

chmod +x script.sh
Run Code Online (Sandbox Code Playgroud)

在Dockerfile中放:

RUN /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

  • 这不是我从[文档](https://docs.docker.com/engine/reference/builder/#/run) 得到的:“`RUN <command>` (*shell* 形式,命令运行在shell,默认情况下在 Linux 上是“/bin/sh -c”,在 Windows 上默认是“cmd /S /C”)”。 (7认同)