【问题标题】:How to run bash function in Dockerfile如何在 Dockerfile 中运行 bash 函数
【发布时间】:2015-12-18 21:33:07
【问题描述】:

我在/root/.profile 中定义了一个bash 函数nvmdocker buildRUN 步骤中调用该函数时找不到该函数。

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

【问题讨论】:

  • RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12' 应该可以解决问题。对你起作用吗? (我不能 100% 确定,因为我不知道您的容器的详细情况如何)
  • 它工作正常。但我正在寻找更好的解决方案。
  • 好的,检查我的答案。 shell 脚本是最简洁的方法。
  • 到目前为止,您还没有接受我的回答。 更好的解决方案是什么意思?
  • NVM 不是为 Docker 设计的。你真的想要两个 Node.js 在一个容器中吗?

标签: bash docker


【解决方案1】:

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

【讨论】:

  • 我需要在一些不同的步骤中运行 nvm。而且我认为当命令被格式化为多行时,bash -c 的正确引用很难控制。
  • 这就是我建议使用 shell 脚本的原因。
  • 我不明白你为什么需要多个脚本。你能详细说明一下吗?一旦我得到它,我可能会提出一些建议。
  • 这不是我从documentation得到的:"RUN <command>(shell形式,命令在shell中运行,默认为/bin/sh -c on Linux 或 cmd /S /C 在 Windows 上)”。
  • 是的,我不确定这个答案是否正确...我的印象是每个RUN 命令在子shell 中执行其内容。
猜你喜欢
  • 2020-08-20
  • 2021-08-26
  • 2022-01-15
  • 2023-02-01
  • 1970-01-01
  • 2022-11-30
  • 2020-05-15
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多