web-dev-qa-db-ja.com

Alpine / Dockerで/ etc / profileを自動的に実行する方法

Alpine Dockerコンテナをインタラクティブに起動するときに/etc/profileを自動的に実行するにはどうすればよいですか? 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コマンドを使用していますか?他に何か不足していますか? DockerでAlpineを使用するために~/.profileまたは/etc/profile.d/ファイルを入手した人はいますか?ありがとう!

22
Jeff Kilbride

まだ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 "で正常に実行されます。


OPプロジェクトDockerfile には、

COPY aliases.sh /etc/profile.d/

ただし、デフォルトのシェルはnotログインシェル(sh -l)であり、これは profileファイル(または/etc/profile.d)はnotsourced です。

sh -lを追加すると動作します:

docker@default:~$ 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
18
VonC

Alpine Linuxのデフォルトのシェルはashです。

Ashは、ログインシェル/etc/profileとして起動された場合、~/.profileおよびsh -lファイルのみを読み取ります。

Ashに/etc/profileまたは非ログインシェルとしての呼び出し時に必要な他のスクリプトをソースさせるには、Ashを起動する前にENVという環境変数を設定する必要があります。

例えばDockerfileで

FROM Alpine:3.5

ENV ENV="/root/.ashrc"

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

あなたがそれを構築するとき、あなたは得る:

deployer@ubuntu-1604-AMD64:~/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

最後に、新しく生成されたコンテナを実行すると、次の結果が得られます。

deployer@ubuntu-1604-AMD64:~/blah$ docker run -ti test /bin/sh
Hello, world!
/ # exit

Ashシェルがログインシェルとして実行されなかったことに注意してください。

クエリに答えるために、

ENV ENV="/root/.ashrc"

で:

ENV ENV="/etc/profile"

また、Alpine LinuxのAsh Shellは、シェルが起動されるたびに/ etc/profileスクリプトを自動的にソースします。

Gotcha:/ etc/profileは通常、1回だけソースされることを意図しています!そのため、ソースを作成せず、代わりに/root/.somercfileを作成することをお勧めします。

ソース: https://stackoverflow.com/a/40538356

24
Jinesh Choksi

前にJineshが述べたように、Alpine Linuxのデフォルトのシェルはashです

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:~$

そしてそれは動作します:)

4