当前位置: 首页 > 面试题库 >

为什么我必须在容器内使用bash -l -c?

有权
2023-03-14
问题内容

我使用以下Dockerfile创建了一个Docker容器(已截断):

FROM ubuntu:12.04
# curl enables downloading of other things
RUN apt-get install curl -y
# download and install rvm...
RUN \curl -L https://get.rvm.io | bash -s stable
# ... so that we can install ruby
RUN /bin/bash -l -c "rvm requirements"

等等。

所有这些都可以,但是我的问题是软件包的安装方式/位置。

如果我仅使用rvm运行rvm,则会显示docker run [...] rvm“无法找到rvm”,但是如果运行,docker run [...] /bin/bash -l -c "rvm"它会起作用。(我在网上找到了“ -l -c”选项,但不知道它们的作用,也找不到令人满意的解释!)

这不是一个docker问题-这是一个bash / * nix问题-我认为存在一些关于如何/在何处安装东西的问题,这可能与在root下运行安装有关?

明确说明-我希望能够直接从CLI运行我安装的内容。

编辑1

推荐使用rvm安装Ruby,但是,如果您想在非交互式,非登录外壳程序(例如,在docker容器内)中运行程序,这只会导致路径和环境变量以及登录脚本无法运行的麻烦。

鉴于我正在使用它来运行一个docker容器,根据定义,该容器是隔离的并且可以恢复(只需构建另一个容器),所以我实际上并不关心切换版本或隔离软件包,因此,我决定安装Ruby
而是从软件包仓库(http://brightbox.com/docs/ruby/ubuntu/)中获取。这“行之有效”。

它可能对您不起作用-我仅通过安装Ruby来获得Foreman
gem,因为我通过Procfile运行html" target="_blank">应用程序,因此我对细节不那么担心,我只需要它起作用即可。如果您要构建Ruby应用程序,则不会遵循我的建议。

我的Dockerfile在这里,FWIW,https:
//index.docker.io/u/yunojuno/dev/


问题答案:

来自bash(1)

  • -l 使bash就像被作为登录shell调用一样
  • -c 如果存在-c选项,则从字符串读取命令。

您正在运行传递给-c参数的命令。-l使它成为登录shell,以便bash首先读取/etc/profile,它可能具有rvm使其工作的路径。

FWIW,这是我要安装rvm在Docker容器中的操作。

# Install some dependencies
RUN apt-get -y -q install curl rubygems

# Install rvm
RUN curl -L https://get.rvm.io | bash -s stable

# Install package dependencies
RUN /usr/local/rvm/bin/rvm requirements

# Install ruby
RUN /usr/local/rvm/bin/rvm install ruby-2.0.0

# create first wrapper scripts
RUN /usr/local/rvm/bin/rvm wrapper ruby-2.0.0 myapp rake rails gem


 类似资料:
  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • Leetcode#11盛水的容器 https://leetcode.com/problems/container-with-most-water/ 给定n个非负整数a1, a2,..., an,其中每个表示坐标(i, ai)处的点。绘制n条垂直线,使得线i的两个endpoint位于(i, ai)和(i,0)。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多的水。 请注意,容器不能倾斜。

  • 根据文档,newInstance()返回一个T:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance() 所以,如果我有一个返回T的方法,为什么我必须强制转换构造函数的返回。newInstance()到T?

  • 我有方法 在正文中,我编写了一些HashMap的键集 看起来还可以,但如果我想重复这个代码 我得用try/catch来包围它。像这样 我不明白为什么

  • 问题内容: 即使等待1的linux手册页很好地说明了您需要让子进程不使其变成僵尸,但它根本无法说明原因。 我围绕一个Ever 循环计划了我的程序(这是我的第一个多线程程序,所以请原谅我的天真),该循环启动子进程,该子进程被ed淘汰,并确保自行终止。 我无法使用,因为这使并行计算变得不可能,因此我可能不得不添加一个存储子pid的进程表,并且不得不使用-不是立即执行,而是经过一段时间- 这是一个问题,