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を使用して設定する必要があります。また、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 2017年

16
@IgorGanapolsky単一の変数を指定しているため、このインスタンスではありません。ただし、複数の変数を指定する場合は問題ありません。詳細については、ENVのドキュメントを参照してください。
Homme Zwaagstra 2017年

30
うまくいきました!=スペースがないように注意してください。次の=ようにスペースを追加すると、ENV PATH = "/opt/gtk/bin:${PATH}"$ PATHがクラッシュします
Diego Juliao

2
これは、HOSTが$PATH追加されたイメージを更新しませんか?
emmdee

2
ENV PATH="/opt/gtk/bin:${PATH}"ENV PATH="/opt/gtk/bin:$PATH"前者と同じではない場合があります。中括弧は、ホストのPATHを提供する場合があります。ドキュメンテーションはこれが事実であることを示唆していませんが、私はそうであると観察しました。これは単純にチェックしてRUN echo $PATH、それを比較するだけですRUN echo ${PATH}
dankirkd

49

ガンターが投稿した答えは正しかったが、それは私がすでに投稿したものと変わらない。問題はENVディレクティブではなく、その後の指示でしたRUN export $PATH

ENVDockerfileで環境変数を宣言したら、環境変数をエクスポートする必要はありません。

RUN export ...行が削除されるとすぐに、私のイメージは正常に構築されました


4
RUN A=BRUN export A、そしてRUN export A=B、有効なシェルコマンドですが、環境に影響を与えるだけで、同じに続くコマンドのRUN指示を(どれもが与えられていません)。同様に、RUN export PATH=/foo; prog1; prog2;(同じRUNで)実行した場合、PATHの変更はとに影響prog1prog2ます。つまり、RUN export $PATHnoop(その変更された環境を使用するプログラムがないため)であり、そのディレクティブがあるかどうかに関係なく、違いはありません。「ガンター」とは、この答えのことですか?
init_js

修正は、実際にはRUNではなくENVディレクティブを使用してPATH値を変更することです。次に、Docker Builderが次のRUNを呼び出すと、これらの変更が引き継がれます。
init_js

5

これはお勧めできません(クリーンなDockerイメージを作成/配布する場合)。PATH変数は/etc/profileスクリプトによって設定されるため、値をオーバーライドできます。

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
あたりとして、このUbuntuのドキュメント/etc/environment代入式のリストではなく、スクリプトであり、そしてあることはほとんどありませんので、変数の展開をサポートしていないRUN構文が働くだろう。
Nicolas Lefebvre

3
はい、展開さexport PATH=<some path>れて/etc/environmentに書き込まれますが、そのファイルはスクリプトではなくのリストであるため、依然として正しくありません<var name>=<value>exportお使いのシステムが仕様外の黒魔術をサポートしていない場合は、失敗する可能性があります。
Nicolas Lefebvre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.