Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么我必须在容器中使用bash-l-c?_Linux_Bash_Shell_Docker - Fatal编程技术网

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

Linux 为什么我必须在容器中使用bash-l-c?,linux,bash,shell,docker,Linux,Bash,Shell,Docker,我使用以下Dockerfile(已截断)创建了docker容器: 等等 这一切都是可行的,但我的问题是如何/在哪里安装软件包 如果我只是使用dockerrun[…]rvm运行rvm我会得到“找不到rvm”,但是如果我运行dockerrun[…]/bin/bash-l-c“rvm”它会工作。(我在网上找到了“-l-c”选项,但不知道它们是做什么的,也找不到对我所做工作的满意解释!) 这不是docker的问题-这是bash/*nix的问题-我想这是关于如何/在哪里安装东西的问题,可能与在root下运

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

等等

这一切都是可行的,但我的问题是如何/在哪里安装软件包

如果我只是使用
dockerrun[…]rvm运行rvm
我会得到“找不到rvm”,但是如果我运行
dockerrun[…]/bin/bash-l-c“rvm”
它会工作。(我在网上找到了“-l-c”选项,但不知道它们是做什么的,也找不到对我所做工作的满意解释!)

这不是docker的问题-这是bash/*nix的问题-我想这是关于如何/在哪里安装东西的问题,可能与在root下运行安装有关

我想说清楚,我希望能够直接从CLI运行我安装的东西

编辑1

使用rvm安装Ruby是推荐的方法,但是如果您希望在非交互式、非登录shell(即docker容器中)中运行东西,这只会导致路径、环境变量和登录脚本无法运行时遇到太多麻烦

考虑到我使用它来运行docker容器,根据定义,docker容器是隔离的、可恢复的(只需构建另一个),我并不真正关心切换版本或隔离包,因此我决定从包repo()安装Ruby。这“很管用”

它可能对你不起作用-我安装Ruby只是为了得到Foreman gem,因为我正在通过Procfile运行一个应用程序,所以我对细节不太在意,我只需要它工作。如果你正在构建一个Ruby应用程序,我不会听从我的建议

我的Dockerfile在这里,FWIW,

来自:

  • -l
    使bash充当一个登录shell
  • -c
    如果存在-c选项,则从字符串中读取命令
您正在运行传递给
-c
参数的命令
-l
使它成为一个登录shell,因此bash首先读取
/etc/profile
,它可能有路径到
rvm
,这正是它工作的原因

FWIW,下面是我如何在docker容器中安装
rvm

# 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

您应该包括
type-ap-rvm
echo$PATH
的输出,将
CMD[“bash”、“-l”]
添加到Dockerfile中也可以。是的-就是这样-谢谢。如果我从主机上运行
docker run[…]bash-l
,我会进入一个外壳可以工作的容器-env vars set等。因此,当我将命令传递给docker run命令时,让命令在登录外壳中运行是我的挑战。也许这只是sys admin习惯,但我通常喜欢给所有东西提供完全限定的路径。这样你(希望)知道你在跑什么。是的,这就是我刚才做的,你赢了我。我想,既然Docker的关键是可重复性和重用性,我就不必担心事情没有达到应有的程度——因为它们总是在与上次完全相同的位置。当然,现在我遇到了ruby错误:/usr/bin/env:ruby\u executable\u hooks:没有这样的文件或目录如果我这样做并尝试运行gem,然后,我得到一个错误:找不到宝石。依我看,记住/bin/bash-l-c“”比记住其他所有内容所在的路径更容易。
# 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