Почему я должен использовать bash -l -c внутри моего контейнера?
Я создал контейнер докеров, используя следующий файл Dockerfile (усеченный):
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 с помощью docker run [...] rvm
, я получаю "Невозможно найти rvm", но если я запустил docker run [...] /bin/bash -l -c "rvm"
, он будет работать. (Я нашел варианты "-l -c" онлайн, но понятия не имею, что они делают, и не может найти удовлетворительного объяснения того, что я делаю!)
Это не вопрос докера - это вопрос bash/* nix - я предполагаю, что там что-то о том, как/где все установлено, возможно, связано с запуском установки под root?
Просто, чтобы быть ясным - я хочу, чтобы иметь возможность запускать то, что я устанавливаю прямо из CLI.
РЕДАКТИРОВАТЬ 1
Установка Ruby с использованием rvm является рекомендуемым методом, однако, если вы хотите запускать вещи в неинтерактивной оболочке без входа (т.е. в контейнер докеров), это просто вызывает слишком много хлопот с помощью путей и переменных среды и входа скрипты не работают.
Учитывая, что я использую это для запуска контейнера докеров, который по определению изолирован и восстанавливается (просто создайте еще один), мне все равно не нужно переключать версии или изолировать пакеты, и поэтому я решил вместо этого установите Ruby из пакета repo (http://brightbox.com/docs/ruby/ubuntu/). Это "просто работает".
Это может не сработать для вас - я только устанавливаю Ruby, чтобы получить драгоценный камень Foreman, поскольку я запускаю приложение через Procfile, поэтому я не беспокоюсь о деталях, мне просто нужно, чтобы он работал, Если вы создаете приложение Ruby, я не буду следовать моему совету.
My Dockerfile здесь, FWIW, https://index.docker.io/u/yunojuno/dev/
Ответы
Ответ 1
От bash(1)
:
-
-l
Сделать bash действовать так, как если бы он был вызван в качестве оболочки входа
-
-c
Если присутствует опция -c, команды считываются из строки.
Вы используете команду, переданную в аргумент -c
. -l
делает его оболочкой входа, поэтому bash сначала читает /etc/profile
, который, вероятно, имеет путь к rvm
, что и заставляет его работать.
FWIW, вот что я делаю, чтобы установить 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