2015-11-06 1 views
2

У меня возникла ситуация, когда мне нужно source файл среды bash, который живет в отдельном томе (вытащил через volumes_from в docker-compose), когда контейнер запускается так, что все будущие команды, запущенные в контейнере, будут выполняться в этой среде bash (это запускает некоторые скрипты и устанавливает множество динамических переменных, втягиваемых из других мест). Причина, по которой я использую том вместо того, чтобы просто добавлять эту команду непосредственно к изображению, - это то, что файл окружения, который мне нужно включить, находится за пределами контекста Dockerfile, а Dockerfiles не поддерживает это.Могу ли я запустить сценарий bash из файла в отдельном томе докера, прежде чем контейнер начнет?

Я попытался добавить строку source /path/to/volume/envfile к файлу .bashrc пользователя root в надежде, что он будет запущен при запуске контейнера, но это не сработало. Я предполагаю, что это потому, что тома фактически не монтируются до тех пор, пока не запустится контейнер/оболочка, и уже запущены команды .bashrc (что имеет смысл).

Есть ли у кого-нибудь идеи о том, как я могу выполнить что-то подобное? Я открыт для альтернативных методов, но одна вещь, которую я не могу здесь изменить, - это перемещение файла, который мне нужен внутри контекста Docker, поскольку это нарушит целый ряд других вещей.

My (слегка отредактированный) Dockerfile и Докер-compose.yml файлы: https://gist.github.com/joeellis/235d90799eb647ab00ec

EDIT: И как испытание, я пытаюсь запустить rake db:create:all на контейнере, как docker-compose run app rake db:create:all который возвращает ошибку, файл окружения, который мне нужен, не может быть найден/загружен. Интересно, что если я закрою контейнер и запустил команду, все это, похоже, отлично работает. Так может быть, когда контейнеру дается команда через run, она не обязательно открывает оболочку, но использует что-то еще?

+1

Работает отлично для меня. Каково ваше базовое изображение и запуск команд? – ISanych

+0

@ Исаныч Ах, хорошо знать, что я на правильном пути, если он работает на вас. Отредактированный пост с файлами Dockerfile и docker-compose.yml – joeellis

ответ

1

Проблема в том, что оболочка, в которой выполняется ваш /src/app/bin/start-app, не является интерактивной оболочкой =>.bashrc не читается!

Вы можете это исправить, делая это: Добавить файл ENV вместо этого: /root/.profile

RUN echo "source /src/puppet/path/to/file/env/bootstrap" >> /root/.profile 

А также запустить команду в качестве входа в оболочку с помощью (ВГ Баш так или иначе для вас через взлома в файле Docker :)):

command: "sh -lc '/src/app/bin/start-app'" 

как команда. Это должно работать нормально :) Проблема в том, что этот файл отсутствует, потому что вы работаете в неинтерактивной оболочке при выполнении команды команды docker. Он работает, когда вы вставляете в контейнер, потому что bam вы получили интерактивную оболочку, которая передает этот файл :)

+0

Это определенно было. Я хотел использовать bash, поэтому в итоге я использовал «bash -login -c»/src/app/bin/start-app'' с тем же эффектом - отлично работал. Большое спасибо за помощь! – joeellis