2016-06-25 3 views
9

Как я могу получить /etc/profile для автоматического запуска при запуске контейнера Alpine Docker в интерактивном режиме? Я добавил некоторые псевдонимы в файл aliases.sh и поместил его в /etc/profile.d, но когда я запускаю контейнер с помощью docker run -it [my_container] sh, мои псевдонимы неактивны. Я должен вручную вводить . /etc/profile из командной строки каждый раз.Как получить/etc/profile для автоматического запуска в Alpine/Docker

Есть ли какая-то другая конфигурация, необходимая для получения /etc/profile для запуска при авторизации? У меня также были проблемы с использованием файла ~/.profile. Любое понимание оценено!

EDIT:

На основании ответа VonC, я вытащил и побежал его пример ruby контейнер. Вот что я получил:

$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 
/# more /etc/profile.d/rubygems.sh 
export PATH=$PATH:/usr/lib/ruby/gems/2.0.0/bin 
/# env 
no_proxy=*.local, 169.254/16 
HOSTNAME=6c7e93ebc5a1 
SHLVL=1 
HOME=/root 
TERM=xterm 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/ 
/# exit 

Хотя файл /etc/profile.d/rubygems.sh существует, он не был запущен, когда я войти в систему и мой PATH переменная не обновляется. Я использую неправильную команду docker run? Что-то еще отсутствует? Кто-нибудь получил ~/.profile или /etc/profile.d/ файлов для работы с Alpine на Docker? Благодаря!

+0

Пробовали ли вы построить альпийские изображения с 'ADD .profile/и т.д./.profile'? –

+2

Нет, я никогда не слышал о попытке использовать '/ etc/.profile'. Я всегда считал, что '.profile' принадлежит вашему каталогу' HOME', тогда как 'profile' (no dot) принадлежит'/etc'. –

ответ

7

Вы все еще можете попробовать в вашем Dockerfile: с

RUN echo '\ 
     . /etc/profile ; \ 
    ' >> /root/.profile 

(. Предполагая, что текущий пользователь является root Если нет, то замените /root с полным домашним путем)

Это, как говорится, те/и т.д. /profile.d/xx.sh должен выполняться.
См codeclimate/docker-alpine-ruby как пример:

COPY files/

С 'files/etc "включая files/etc/profile.d/rubygems.sh работает нормально


В OP projectDockerfile, есть

COPY aliases.sh /etc/profile.d/ 

Но. по умолчанию - не оболочка для входа (sh -l), что означает profile files (or those in /etc/profile.d) are not sourced.

Добавление sh -l будет работать:

[email protected]:~$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 sh -l 
87a58e26b744:/# echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/ruby/gems/2.0.0/bin 
+0

VonC: Я попытался использовать файл '/ root/.profile' тоже с теми же определениями псевдонимов, которые я помещаю в файл'/etc/profile.d/aliases.sh'. На самом деле, это было первое, что я пробовал. Я подумал, что, возможно, что-то изменилось с «ash» и «sh» на Alpine, что мне не хватало - по какой-то причине мой «.profile» не читался. Я рассмотрю ваш пример. Благодаря! –

+0

Кстати, вот базовый контейнер 'Node', в котором я использую файл' aliases.sh'. Возможно, кто-то может вытащить этот контейнер и посмотреть, правильно ли работают псевдонимы и цветовые подсказки при входе в систему ... 'https: // hub.docker.com/r/jkilbride/node-npm-alpine /' –

+0

@JeffKilbride У меня есть отредактировал мой ответ. Может быть, chmod отсутствует? – VonC

9

по умолчанию оболочка в Alpine Linux является ash.

Пепел будет читать только файлы /etc/profile и ~/.profile, если он запущен как оболочка для входа sh -l.

Чтобы заставить Ash исправить /etc/profile или любой другой скрипт, который вы хотите использовать при вызове в качестве оболочки без входа, вам необходимо настроить переменную окружения с именем ENV перед запуском Ash.

например.в вашем Dockerfile

FROM alpine:3.5 

ENV ENV="/root/.ashrc" 

RUN echo "echo 'Hello, world!'" > "$ENV" 

Когда вы строите, что вы получите:

[email protected]:~/blah$ docker build --tag test . 
Sending build context to Docker daemon 2.048kB 
Step 1/3 : FROM alpine:3.5 
3.5: Pulling from library/alpine 
627beaf3eaaf: Pull complete 
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 
Status: Downloaded newer image for alpine:3.5 
---> 4a415e366388 
Step 2/3 : ENV ENV "/root/.ashrc" 
---> Running in a9b6ff7303c2 
---> 8d4af0b7839d 
Removing intermediate container a9b6ff7303c2 
Step 3/3 : RUN echo "echo 'Hello, world!'" > "$ENV" 
---> Running in 57c2fd3353f3 
---> 2cee6e034546 
Removing intermediate container 57c2fd3353f3 
Successfully built 2cee6e034546 

Наконец, при запуске вновь созданный контейнер, вы получите:

[email protected]:~/blah$ docker run -ti test /bin/sh 
Hello, world! 
/# exit 

Обратите внимание на Ash оболочки Ждут» t запускается как оболочка входа.

Так, чтобы ответить на ваш запрос, заменить

ENV ENV="/root/.ashrc" 

с:

ENV ENV="/etc/profile" 

и Alpine Linux в Ash оболочка будет автоматически источник/и т.д./Профиль сценарий каждый раз, когда оболочка запускается.

Gotcha:/etc/profile обычно предназначен для получения только одного источника! Итак, я бы посоветовал вам не использовать его и вместо этого вместо этого использовать файл /root/.somercfile.

Источник: https://stackoverflow.com/a/40538356

2

Как упомянуто Jinesh ранее, оболочка по умолчанию в Alpine Linux пепельно

localhost:~$ echo $SHELL 
/bin/ash 
localhost:~$ 

Поэтому простое решение слишком добавить свои псевдонимы в .profile. В этом случае, я положил все свои псевдонимы в ~/.ash_aliases

localhost:~$ cat .profile 
# ~/.profile 

# Alias 
if [ -f ~/.ash_aliases ]; then 
    . ~/.ash_aliases 
fi 

localhost:~$ 

.ash_aliases файл

localhost:~$ cat .ash_aliases 
alias a=alias 
alias c=clear 
alias f=file 
alias g=grep 
alias l='ls -lh' 
localhost:~$ 

И это работает :)

Смежные вопросы