Docker-compose.ymlのPATHにいくつかのパスを追加する必要があります
docker-compose.ymlで私が試しました
app:
...
environment:
- PATH /code/project
しかし、それは既存のPATHを上書きするだけです-一方、既存のPATHに追加したいのですが
docker-compose.yml
は、Dockerイメージで既に設定されている環境変数を拡張する手段を提供しません。
そのようなことを行うために私が見る唯一の方法は、何らかの環境変数を期待するDockerイメージを持つことです(たとえば、ADDITONAL_PATH
)および実行時独自のPATH
環境変数とともに拡張します。
次のDockerfileを見てみましょう:
FROM busybox
ENV PATH /foo:/bar
CMD export PATH=$PATH:$ADDITIONAL_PATH; /bin/echo -e "ADDITIONAL_PATH is $ADDITIONAL_PATH\nPATH is $PATH"
そして、次のdocker-compose.ymlファイル(Dockerfileと同じディレクトリ内):
app:
build: .
イメージをビルドします:docker-compose build
そして、コンテナを開始します:docker-compose up
、次の出力が得られます。
app_1 | ADDITIONAL_PATHは
app_1 | PATHは/ foo:/ bar:です
docker-compose.ymlファイルを次のように変更します:
app:
build: .
environment:
- ADDITIONAL_PATH=/code/project
そして、コンテナを開始します:docker-compose up
、次の出力が得られます。
app_1 | ADDITIONAL_PATHは/ code/projectです
app_1 | PATHは/ foo:/ bar:/ code/projectです
docker-compose.ymlファイルの構文エラーにも注意してください:等号(=
)環境変数の名前とその値の間の文字。
environment:
- PATH=/code/project
の代わりに
environment:
- PATH /code/project
私はこれが古いスレッドであることを知っていますが、明確にすることができるものがいくつかあると思います。
docker-compose
ファイルを介してホストマシンからの変数のみをアドレス指定できるため、不可能ですdocker-compose.ymlからイメージのPATHを拡張することはできません:
app:
...
environment:
- PATH=/code/project:$PATH
一方、RUNまたはCMD EXPORTディレクティブを使用しても、[〜#〜] exported [〜#〜]変数がイメージを介して保持されないため、十分ではありません。 。すべてのDockerfileディレクティブは中間イメージを生成するため、これらの値は実際に必要なメインイメージではなく、それらに反映されます。
最適なオプションは、docker-compose.yml
でビルドオプションを使用することです。
app:
build: .
eNVオプションをDockerfileに追加します:
ENV PATH /path/to/bin/folder:$PATH
これは問題で提案されています #684 そして私はまた答えを見ることを提案します: docker ENV vs RUN export 。
addの値を指定できます。そのためには、コンテナーの名前またはIDを知る必要があります。それを実行して、コンテナーを認識します。
docker ps
これにより、実行中のすべてのコンテナの詳細が出力されます。コンテナを探し、そのIDまたは名前をコピーします。次に、これを実行します:
docker inspect <container ID>
指定されたコンテナのすべての値を印刷します。 [〜#〜] env [〜#〜]セクションを探し、[〜#〜] path [〜#〜]環境変数を見つけます。次に、その値をコピーし、変更を追加して新しい値で拡張し、docker-compose.ymlの「environment」セクションで再度設定します。
app
environment:
- PATH=value-you-copied:new-value:new-value:etc
PATHの初期値から何も削除せず、単に拡張して新しい値を追加する必要があることに注意してください。
@Thomasleveilの答えは、(build
を介して)docker-composeファイルから直接構築されたコンテナに対してのみ機能します。また、実行されるコマンドを制御することはできません。
これがまったく機能しないリポジトリからダウンロードしたコンテナにこの機能が必要でした。
entrypoint
とcommand
を使用して解決策を見つけました。
いくつかのベースコンテナbase
と、それに基づいた別のコンテナJava7
を用意しましょう。最後に、Java7
コンテナを使用していくつかの処理を実行するdocker-composeを作成します。
おそらくここで最も重要なファイル、entrypoint.sh
$ cat base/script/entrypoint.sh
#!/bin/bash
export PATH="$PATH_ADD:$PATH"
echo "Path modified to $PATH"
exec $@
base
コンテナのDockerfile
$ cat base/Dockerfile
FROM xxx
# copy entrypoint script that extends current PATH variable by PATH_ADD
COPY script/entrypoint.sh /usr/sbin
ENTRYPOINT ["/usr/sbin/entrypoint.sh"]
Java7
コンテナのDockerfile
$ cat Java7/Dockerfile
FROM base
# download Java7
curl ... /opt/Java/jdk7
ENV Java_HOME /opt/Java/jdk7
Docker-composeによって実行されるコマンド
$ cat sbin/run-app1.sh
exec $Java_HOME/bin/Java -version
$ cat sbin/run-app2.sh
exec $Java_HOME/bin/Java -version
これらを使用したDocker-compose:
$ cat docker-compose.yml
version: '3'
services:
app1:
image: Java7
command: run-app1.sh
environment:
PATH_ADD: /app/sbin
volumes:
- "./sbin:/app/sbin:cached"
app2:
image: Java7
command: run-app2.sh
environment:
PATH_ADD: /app/sbin
volumes:
- "./sbin:/app/sbin:cached"
ファイル構造
$ tree
.
├── base
│ ├── script
│ │ └── entrypoint.sh
│ └── Dockerfile
├── Java7
│ └── Dockerfile
├── sbin
│ ├── run-app1.sh
│ └── run-app2.sh
└── docker-compose.yml