起動時にアッシュロードをいくつかの環境変数にする方法は?
/etc/profileに入れてください。
/etc/profile はログインシェルからのみ読み込みます。 dockerを使用するとき(alpine> busybox> ashを使用)、頻繁に表示される非ログインシェルはどうですか?
環境変数 ENV で指定した場合、ログインしていないシェルはファイルを読み込みます。
いいですね。 ENVが設定されていることをどのように確認できますか?環境変数自体であり、デフォルトでは空です。
本質的に、私はAshが読むことができるようにする重要な設定ファイルを探しています。 busyboxで使用されているAshのバージョンをお勧めします(正確さが必要な場合はBusyBox v1.28.4)。そんなことがありますか?はい、私はdockerイメージを構築するときに$ ENVを設定するために使用できるdockerのENVディレクティブを知っています。これがdockerの外で可能かどうかはまだ知りたいです。
しかし、Gaoshanのこの奇妙な行動を説明できる人はいますか?
$docker run -it alpine
/ # echo $CHARSET #proof /etc/profile has not run
/ # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/ # env -i sh -c 'echo $PATH'
/sbin:/usr/sbin:/bin:/usr/bin
/ # echo $ENV
/ #
/etc/profileがまだ追加されていないことを示すことができる場合は、新しいシェルのデフォルトのPATH設定と比較してPATHに何が追加されますか?これはdocker Dickeryでもありません。 AlpineのDockerfileは意図的に最小化されました。
FROM scratch
ADD rootfs.tar.xz / #Automatically extracts, and I’m pretty sure that’s all
CMD ["/bin/sh"]
誰かが$ ENVを使用せずに非ログインシェルで環境変数を維持する方法を見つけたように見えるので、これについて言及します。
いくら関連性がなくても、すべての情報や文脈に感謝します。
ベストアンサー1
Dockerコンテナを実行すると、次のことが実行されます。離れて通話環境で。変数は直接継承されません。
完全に最小限のコンテナを作成して見ることができる「きれいな」環境を見ることができます。
たとえば、go
プログラムは次のようになります。
package main
import "os"
import "fmt"
func main() {
for _, e := range os.Environ() {
fmt.Println(e)
}
}
これを小さなコンテナに作成できます。
FROM scratch
ADD tester /
ENTRYPOINT ["/tester"]
これを実行すると:
$ docker run tst
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e598bf727a26
HOME=/root
ドッカーエンジンが生成した変数です。走る。
したがって、非ログインシェルを実行すると、run .. /bin/sh
dockerによって作成された環境のみが継承されます。ログインシェルではないため/etc/profile
実行されません。 /bin/sh
存在しない場合は、独自にいくつかの基本変数を生成します。
$ docker run -it alpine
/ # env
HOSTNAME=51667ed06110
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
したがって、これを行うにはいくつかの方法があります。私の心には二つの考えが浮かんだ。
dockerコマンドラインを使用して、dockerコマンドラインから環境変数を渡すことができます-e
。
$ docker run -e myvariable=testing -it alpine /bin/sh
/ # echo $myvariable
testing
次のコマンドを使用して、alpineに基づいて独自のイメージを作成できますENV
。
$ cat Dockerfile
FROM alpine
ENV myothervar=anothertest
$ docker build -t myalpine .
...
$ docker run -it myalpine
/ # echo $myothervar
anothertest
/bin/sh
デフォルトでは、dockerランタイムはいくつかの変数を提供し、他の変数を提供し、呼び出し環境から分離されていることがわかります。