Ash(Almquist 쉘)에 환경 변수를 저장하는 방법은 무엇입니까?

Ash(Almquist 쉘)에 환경 변수를 저장하는 방법은 무엇입니까?

시작 시 애쉬 로드를 일부 환경 변수로 만드는 방법은 무엇입니까?

/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

도커 컨테이너를 실행하면 다음이 실행됩니다.외딴통화 환경에서. 변수는 직접 상속되지 않습니다.

완전히 최소한의 컨테이너를 만들어서 볼 수 있는 "깨끗한" 환경을 볼 수 있습니다.

예를 들어 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/shdocker가 만든 환경만 상속받습니다. 로그인 쉘이 아니기 때문에 /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 런타임은 일부 변수를 제공하고 다른 변수를 제공하며 호출 환경에서 격리되어 있다는 것을 알 수 있습니다 .

관련 정보