web-dev-qa-db-ja.com

ash、Almquistシェルで環境変数を永続化する方法は?

起動時にいくつかの環境変数をロードするためにashを取得するにはどうすればよいですか?

それらを/ etc/profileに入れるだけです

/ etc/profileはログインシェルでのみ読み込まれます。 Docker(Alpine> busybox> ashを使用)で作業するときに頻繁にポップアップする非ログインシェルはどうですか?

非ログインシェルは、環境変数ENVで指定されている場合、ファイルを読み取ります

ENVが設定されていることを確認するにはどうすればよいですか?それ自体が環境変数であり、デフォルトでは空白です。

基本的に、ashが読み取ることが保証されている包括的な構成ファイルを探しています。 busyboxで使用されるashのバージョンの設定(正確にしたい場合は、BusyBox v1.28.4)。そのようなものは存在しますか?そして、はい、DockerのENVディレクティブについて知っています。これは、Dockerイメージを構築するときに$ ENVを設定するために使用できます。これがdockerの外で可能かどうかはまだ知りたいです。

thisthis を読んで理解しました。

ちなみに、アルパインでのこの奇妙な行動を誰かが説明できますか?

$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

/ #

新しいシェルに設定されたデフォルトの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
DJV

Dockerコンテナーを実行すると、呼び出し環境からisolatedが実行されます。変数は直接継承されません。

完全に最小限のコンテナを作成することで確認できる「クリーンな」環境を確認できます。

例えば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

これらは、ランタイムでDockerエンジンによって作成された変数です。

したがって、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=/

これを行うにはいくつかの方法があります。私の頭の上から、ここに2つのアイデアがあります:

Dockerコマンドラインで-eを使用して環境変数を渡すことができます。

$ docker run -e myvariable=testing -it Alpine /bin/sh
/ # echo $myvariable
testing

ENVコマンドを使用して、アルパインに基づいて独自のイメージを作成できます。

$ cat Dockerfile 
FROM Alpine
ENV myothervar=anothertest

$ docker build -t myalpine .
...

$ docker run -it myalpine
/ # echo $myothervar
anothertest

基本的に、表示されているのは、いくつかの変数を提供するDockerランタイム、他の変数を提供する/bin/sh、および呼び出し環境からの分離です。

1
Stephen Harris