bash - 如何在 Dockerfile 中运行 bash 函数

标签 bash docker

我在 /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/

相关文章:

arrays - Bash:有没有一种方法可以轻松地将大数组分成较小的数组?

linux - 每次我启动 unix 时都会获取一个文件

jenkins - 为持续交付创建大量 Docker 标签有什么问题吗?

php - 无法将 PhpStorm 与 xdebug 与 Docker 连接

docker - 使用ECS的Docker级负载均衡

bash - 从脚本中找不到 docker-compose

linux - 编写脚本以获取用户输入并使用错误检查来测试是否输入了两个参数 : Linux

c++ - 如何在 C++ 代码中获取终端维度?

java - 无法从另一个docker容器连接到docker容器中的mysql

linux - BASH - 如何在网络接口(interface)启动并可访问互联网时执行少量应用程序?