web-dev-qa-db-ja.com

PATHへのdocker-composeの追加

Docker-compose.ymlのPATHにいくつかのパスを追加する必要があります

docker-compose.ymlで私が試しました

app:
    ...
    environment:
        - PATH /code/project

しかし、それは既存のPATHを上書きするだけです-一方、既存のPATHに追加したいのですが

19
lukeaus

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
14
Thomasleveil

私はこれが古いスレッドであることを知っていますが、明確にすることができるものがいくつかあると思います。

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

1
Rocksn17

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ファイルから直接構築されたコンテナに対してのみ機能します。また、実行されるコマンドを制御することはできません。

これがまったく機能しないリポジトリからダウンロードしたコンテナにこの機能が必要でした。

entrypointcommandを使用して解決策を見つけました。

いくつかのベースコンテナ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
0
Petr Újezdský