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/
ファイルを入手した人はいますか?ありがとう!
まだ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
"で正常に実行されます。
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
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を作成することをお勧めします。
前に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:~$
そしてそれは動作します:)