Как заставить / etc / profile автоматически запускаться в Alpine / Docker

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

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

РЕДАКТИРОВАТЬ:

Основываясь на ответе 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? Спасибо!

 Nguyen Sy Thanh Son25 июн. 2016 г., 05:54
Вы пытались создать Alpine Images сADD .profile /etc/.profile?
 Jeff Kilbride25 июн. 2016 г., 19:58
Нет, я никогда не слышал о попытках использовать/etc/.profile, Я всегда верил, что.profile принадлежит в вашемHOME каталог, тогда какprofile (без точки) принадлежит/etc.

Ответы на вопрос(3)

Как упоминалось ранее Джинешем, оболочкой по умолчанию в 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:~$

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

 Scott Lindner08 авг. 2018 г., 00:18
Есть ли эквивалент файла /etc/profile.d для файлов * .sh? Я должен установить некоторые переменные среды программно. На данный момент я принял решение Джинеша, но я предпочитаю делать это наиболее подходящим способом.

Оболочка по умолчанию в Alpine Linuxash.

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

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

например в вашем 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 не работает как оболочка входа в систему.

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

ENV ENV="/root/.ashrc"

с:

ENV ENV="/etc/profile"

и оболочка Ash Alpine Linux будет автоматически использовать скрипт / etc / profile при каждом запуске оболочки.

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

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

Решение Вопроса

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

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

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

При этом, те /etc/profile.d/xx.sh должны работать.
Увидетьcodeclimate/docker-alpine-ruby В качестве примера:

COPY files /

С 'files/etc"в том числеfiles/etc/profile.d/rubygems.sh работает просто отлично

вОП проект Dockerfile, Eсть

COPY aliases.sh /etc/profile.d/

Но оболочка по умолчаниюне оболочка входа в систему (sh -l), что означаетprofile файлы (или те, в/etc/profile.d) являютсяне 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
 VonC25 июн. 2016 г., 21:53
@JeffKilbride Я докер, тянущий ваше изображение, пока мы говорим.
 VonC25 июн. 2016 г., 21:47
@JeffKilbride имеет смысл, я просто проверял на всякий случай.
 VonC25 июн. 2016 г., 20:25
@JeffKilbride Я отредактировал свой ответ. Может быть, chmod отсутствует?
 Jeff Kilbride25 июн. 2016 г., 20:31
VonC: Спасибо за быстрое обновление! Пожалуйста, посмотрите изменения, которые я внес в мой оригинальный пост выше. Я вытащил и побежалcodeclimate/docker-alpine-ruby и были те же проблемы. мойPATH переменная не была обновленаrubygems.sh файл в/etc/profile.d.
 Jeff Kilbride25 июн. 2016 г., 21:49
Вы вошли в этоcodeclimate/alpine-ruby контейнер? Обновляет ли он вашPATH правильно? Мне интересно, это просто проблема, которую я вижу, или у других тоже. Если это больше, чем только я, я выложу что-нибудь наalpinelinux.org.
 VonC25 июн. 2016 г., 22:03
@JeffKilbride Понял. Оболочка, открываемая по умолчанию при запуске Docker:не оболочка входа в систему (все детали вaskubuntu.com/a/247769/5470). Я отредактировал свой ответ, показывая правоdocker run который работает.
 Jeff Kilbride25 июн. 2016 г., 22:11
VonC Круто! Я подумал, что это было что-то странное сdocker, но не смог найти ответ.sh -l работает на меня. Спасибо за помощь!
 VonC25 июн. 2016 г., 21:29
@JeffKilbride Не могли бы вы сделатьls -alrt /etc/profile.d чтобы увидеть, исполняется ли этот сценарий sh или нет?
 Jeff Kilbride25 июн. 2016 г., 20:05
VonC: я пытался использовать/root/.profile файл тоже с теми же определениями псевдонима я помещаю в/etc/profile.d/aliases.sh файл. На самом деле, это было первое, что я попробовал. Я думал, может быть, было что-то другое сash а такжеsh на альпийском который мне не хватало - почему то мой.profile не читал Я посмотрю на ваш пример. Спасибо!
 Jeff Kilbride25 июн. 2016 г., 20:12
Кстати, вот основнойNode контейнер, в котором я используюaliases.sh файл. Может быть, кто-то может вытащить этот контейнер и посмотреть, правильно ли работают псевдонимы и подсказки цвета при входе в систему ...https://hub.docker.com/r/jkilbride/node-npm-alpine/
 Jeff Kilbride25 июн. 2016 г., 21:47
rubygems.sh файл не исполняемый, этоrw-rw-r или же0664, Я попробуюaliases.sh файл, но я скептически отношусь к тому, что проблема. Эти файлы поставляются с. filename.sh в/etc/profile, Они не должны быть исполняемыми. Даже примерcolor_prompt файл, который поставляется сAlpine не является исполняемым И ни один из моих файлов, которые настраивают оболочку на другихLinux дистрибутивы исполняемые (например,git-prompt.sh, .bash_profile, .bashrcи т.д ...) Соответствующая строка в/etc/profile являетсяif [ -r $script ] Итак, это тестирование на читабельность.

Ваш ответ на вопрос