1. 개요

이 기사에서는 Docker에서 PATH 변수 를 업데이트하는 방법을 살펴봅니다 . 먼저 전 세계적으로 업데이트하겠습니다. 그런 다음 지침의 하위 집합으로 변경을 제한합니다.

2. 전역 PATH 변수 업데이트

ENV 문을 사용하여 PATH 변수 를 업데이트할 수 있습니다 . 이 동작을 보여주기 위해 예제 Dockerfile 을 작성해 보겠습니다.

FROM ubuntu:latest
RUN echo $PATH
ENV PATH="$PATH:/etc/profile"
RUN echo $PATH

첫 번째 줄은 최신 Ubuntu 이미지를 사용한다고 명시합니다. 또한 ENV 명령 전후 에 PATH 변수 의 값을 기록하고 있습니다 .

이미지를 구축해 봅시다:

$ docker build -t baeldungimage .
#4 [1/3] FROM docker.io/library/ubuntu:latest
#5 [2/3] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#5 0.683 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#6 [3/3] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile
#6 0.893 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile

예상대로 /etc/profile 이 PATH 에 추가되었습니다 .

3. 명령어 시퀀스에 대해서만 PATH 업데이트

RUN 명령어를 사용 하여 sh 스크립트를 실행하여 PATH 를 내보냅니다 . 그런 다음 동일한 RUN안에 다른 명령을 추가 합니다. 그러면 RUN안에 PATH 의 로컬 값이 인쇄됩니다 . 또한 변경되지 않았는지 확인하기 위해 나중에 PATH 전역 변수를 기록합니다.

새로운 Dockerfile 은 다음과 같습니다 .

FROM ubuntu:latest
RUN echo $PATH
RUN export PATH="$PATH:/etc/profile"; echo $PATH
RUN echo $PATH

이제 이미지를 빌드할 수 있습니다.

$ docker build -t baeldungimage . 
#7 [1/4] FROM docker.io/library/ubuntu:latest
#4 [2/4] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#4 0.477 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#5 [3/4] RUN export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile"; echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#5 0.660 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile
#6 [4/4] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#6 0.661 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

로그는 PATH 변수를 내보낸 후 해당 값이 동일한 RUN 명령 내부의 추가 명령에서 사용됨을 확인합니다. 그러나 전역 변수는 변경되지 않았습니다.

4. 셸 세션 내 에서 PATH 업데이트

이제 쉘 세션에 대해서만 PATH 를 업데이트하는 방법을 살펴보겠습니다 . 먼저 모든 셸 세션이 시작될 때 PATH 를 업데이트하도록 .bashrc 파일을 수정합니다. 그런 다음 이 동작을 확인하기 위해 셸 세션을 시작합니다.

4.1. .bashrc 파일 편집

.bashrc 파일 을 편집하여 모든 셸 세션 시작 시 새 PATH 를 내보낼 것 입니다. 이를 위해 원본 파일에 내보내기를 추가 하는 빠른 스크립트 를 실행합니다. 이전에 했던 것처럼 이 변경 사항이 전역 PATH 변수에 영향을 미치지 않는지 확인합니다.

새로운 Dockerfile 은 다음과 같습니다 .

FROM ubuntu:latest
RUN echo $PATH
RUN echo "export PATH=$PATH:/etc/profile" >> ~/.bashrc
RUN cat ~/.bashrc
RUN echo $PATH

또한 cat 명령을 사용하여 파일을 보았다는 점에 유의하십시오.

이미지를 빌드해 보겠습니다.

$ docker build -t baeldungimage . 
#4 [1/5] FROM docker.io/library/ubuntu:latest
#5 [2/5] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#5 0.447 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#6 [3/5] RUN echo "export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile" >> ~/.bashrc
#7 [4/5] RUN cat ~/.bashrc
#7 0.956 # ~/.bashrc: executed by bash(1) for non-login shells.
#7 0.956 # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
#7 0.956 # for examples
#7 0.956
#7 0.956 # If not running interactively, don't do anything
#7 0.956 [ -z "$PS1" ] && return
[... .bashrc full content]
#7 0.956 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile
#7 DONE 1.0s
#8 [5/5] RUN echo /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#8 0.867 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

보시다시피 전역 PATH 는 변경되지 않았습니다. 그러나 내보내기 행은 실제로 파일 끝에 추가되었습니다. 결과적으로 .bashrc 가 로드 될 때마다 실행 중인 셸 의 PATH 변수를 업데이트합니다.

4.2. 대화형 모드에서 컨테이너 실행

이제 앞에서 본 출력에서 ​​.bashrc 파일 의 첫 번째 몇 줄에 초점을 맞추겠습니다 . 이 줄은 원본 파일에서 가져온 것입니다. " 대화식으로 실행하지 않으면 아무것도 하지 마십시오 "라고 명확하게 명시 되어 있습니다.

Dockerfile 을 빌드할 때 RUN 명령이 대화형이 아니라는 점을 이해하는 것이 중요합니다 . 따라서 경로가 업데이트되었는지 확인하기 위해 빌드 중에 .bashrc 파일을 소싱하고 스크립트를 실행할 수 없습니다 .

대신 대화형 모드에서 컨테이너를 실행하고 셸 세션을 열 수 있습니다.

$ docker run -it --name interactiveimage baeldungimage
root@18781222594f:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/etc/profile

쉘 세션에서 PATH를 인쇄했습니다. /etc/profile 이 추가 되어 .bashrc 파일이 고려 되었음을 확인할 수 있습니다.

5. 결론

이 사용방법(예제)에서는 Docker에서 PATH 변수 를 업데이트하는 방법을 살펴보았습니다 . 처음에는 변수를 전역적으로 업데이트했지만 더 많은 제한 사항으로 업데이트하는 방법도 배웠습니다.

항상 그렇듯이 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner