Dockerfile에서 PATH 환경 변수를 업데이트하는 방법은 무엇입니까?


388

소스에서 GTK를 다운로드하고 빌드하는 dockerfile이 있지만 다음 줄은 이미지의 환경 변수를 업데이트하지 않습니다.

RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH

환경 값을 설정하기 위해 ENV를 사용해야한다는 것을 읽었지만 다음 지침이 작동하지 않는 것 같습니다.

ENV PATH /opt/gtk/bin:$PATH

이것은 전체 Dockerfile입니다.

FROM ubuntu
RUN apt-get update
RUN apt-get install -y golang gcc make wget git libxml2-utils libwebkit2gtk-3.0-dev libcairo2 libcairo2-dev libcairo-gobject2 shared-mime-info libgdk-pixbuf2.0-* libglib2-* libatk1.0-* libpango1.0-* xserver-xorg xvfb

# Downloading GTKcd
RUN wget http://ftp.gnome.org/pub/gnome/sources/gtk+/3.12/gtk+-3.12.2.tar.xz
RUN tar xf gtk+-3.12.2.tar.xz
RUN cd gtk+-3.12.2

# Setting environment variables before running configure
RUN CPPFLAGS="-I/opt/gtk/include"
RUN LDFLAGS="-L/opt/gtk/lib"
RUN PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig"
RUN export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
RUN ./configure --prefix=/opt/gtk
RUN make
RUN make install

# running ldconfig after make install so that the newly installed libraries are found.
RUN ldconfig

# Setting the LD_LIBRARY_PATH environment variable so the systems dynamic linker can find the newly installed libraries.
RUN LD_LIBRARY_PATH="/opt/gtk/lib"

# Updating PATH environment program so that utility binaries installed by the various libraries will be found.
RUN PATH="/opt/gtk/bin:$PATH"
RUN export LD_LIBRARY_PATH PATH

# Collecting garbage
RUN rm -rf gtk+-3.12.2.tar.xz

# creating go code root
RUN mkdir gocode
RUN mkdir gocode/src
RUN mkdir gocode/bin
RUN mkdir gocode/pkg

# Setting the GOROOT and GOPATH enviornment variables, any commands created are automatically added to PATH
RUN GOROOT=/usr/lib/go
RUN GOPATH=/root/gocode
RUN PATH=$GOPATH/bin:$PATH
RUN export GOROOT GOPATH PATH

1
LD_LIBRARY_PATH 및 PATH는 ENV not export를 사용하여 설정해야합니다. 또한 LD_LIBRARY_PATH는 PATH를 가리켜서는 안됩니다!. Dockerfile에서 파일을 삭제해도 이미지가 작아지지는 않습니다 . Centurylinklabs.com/optimizing-docker-images/?hvid=4wO7Yt를 확인 하십시오 .
Javier Castellanos

현재 dockerfile은 유효한 파일입니까?
Hui Wang

@HuiWang 그렇지 않을 수 있습니다. 그것은 쓰여졌 고, 그것은 1.5 년 전에 쓰여졌으며 그 이후로 많은 것이 바뀌 었습니다. 선택한 답변에 설명 된 변경 사항을 통합하십시오.
ILikeTacos

답변:


608

다음과 같이 환경 교체 를 사용할 수 있습니다 Dockerfile.

ENV PATH="/opt/gtk/bin:${PATH}"

14
되어 =등호는 필요에 서명?
IgorGanapolsky

16
@IgorGanapolsky이 경우에는 단일 변수를 지정하므로 해당되지 않습니다. 그러나 여러 변수를 지정할 때 아프지 않고 필수입니다. 자세한 내용은 ENV 설명서 를 참조하십시오.
Homme Zwaagstra

30
작동합니다! [정보를 확인하시기 바랍니다 =이 공백없이 할 필요가있다. 다음과 =같이 공백을 추가하면 ENV PATH = "/opt/gtk/bin:${PATH}"$ PATH가
충돌합니다

2
이렇게하면 HOST가 $PATH추가 된 이미지가 업데이트되지 않습니까?
emmdee

2
ENV PATH="/opt/gtk/bin:${PATH}"과 다를 수 있습니다 ENV PATH="/opt/gtk/bin:$PATH"호스트의 경로를 제공 할 수있는, 중괄호, 전. 문서는 이것이 사실이라고 제안하지는 않지만 그 사실을 관찰했습니다. 이것은 단순히 확인 RUN echo $PATH하고 비교하는 것입니다RUN echo ${PATH}
dankirkd

49

Gunter가 게시 한 답변은 정확하지만 이미 게시 한 내용과 다르지 않습니다. 문제는 ENV지시문이 아니라 후속 지시 였습니다RUN export $PATH

ENVDockerfile에서 환경 변수를 선언하면 환경 변수를 내보낼 필요가 없습니다 .

RUN export ...선을 제거 하자마자 내 이미지가 성공적으로 작성되었습니다.


4
RUN A=B, RUN export ARUN export A=B유효한 쉘 명령하지만, 환경에 영향을 단지 동일한에 따라 명령의 RUN지시를 (그러나 아무도는 주어지지). 마찬가지로 RUN export PATH=/foo; prog1; prog2;(같은 RUN에서) PATH 수정은 prog1및에 영향을줍니다 prog2. 따라서 RUN export $PATH프로그램이 수정 된 환경을 사용하지 않기 때문에 noop이며 해당 지시어가 있는지 여부는 차이가 없습니다. "Gunter"는 이 답변 을 의미 합니까?
init_js

수정은 실제로 RUN이 아닌 ENV 지시문으로 PATH 값을 변경하는 것입니다. 그런 다음 docker builder가 다음 RUN을 호출하면 이러한 변경 사항이 적용됩니다.
init_js

5

PATH변수는 /etc/profile스크립트 로 설정 되므로 값을 무시할 수 있으므로 권장하지 않습니다 (깨끗한 Docker 이미지를 작성 / 배포하려는 경우) .

head /etc/profile:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

Dockerfile의 끝에 다음을 추가 할 수 있습니다.

RUN echo "export PATH=$PATH" > /etc/environment

따라서 모든 사용자에 대해 PATH가 설정됩니다.


4
이 우분투 문서 , /etc/environment할당 식의 목록이 아니라 스크립트이며,이 가능성은 그래서 변수 확장을 지원하지 않는 RUN구문이 작동합니다.
니콜라스 레 페브르

3
예, 파일이 확장되어에 export PATH=<some path>쓰여질 것입니다. /etc/environment해당 파일은 스크립트가 아니라의 목록이므로 여전히 올바르지 않습니다 <var name>=<value>. export시스템이 사양 이외의 일부 흑 마법을 지원하지 않으면 실패 할 수 있습니다.
니콜라스 레 페브르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.