1

docker-compose の初心者向けの質問があります。Docker イメージを作成し、社内の Artifactory リポジトリにプッシュする既存の Jenkins ビルドがあります。これは、Maven/Docker と、アプリ用とボリューム/データ コンテナー用の 2 つの Dockerfile を使用することによって実行されます。Dockerfile は次のようになります。

アプリ:

FROM centos
RUN useradd -u 6666 -ms /bin/bash foouser
COPY src/main/resources/home/foouser/.bashrc /home/foouser/
RUN chown -R foouser:foouser /home/foouser
USER foouser
COPY src/main/resources/opt/myapp/bin/startup.sh /opt/myapp/bin/
WORKDIR /home/foouser
ENTRYPOINT /opt/myapp/bin/startup.sh && /bin/bash

データ コンテナ:

FROM centos
# Environment variable for the path to mount/create. Defaults to /opt/data
ENV DATA_VOL_PATH="/opt/data"

# Make sure the user id is the same as the container using the volume, otherwise we may run into permission issues on
# the container mounting the volume.
RUN useradd -u 6666 -ms /bin/bash foouser && \
    mkdir -p "$DATA_VOL_PATH" && \
    chown -R foouser:foouser "$DATA_VOL_PATH"
VOLUME [ "$DATA_VOL_PATH" ]

簡潔にするために、ラベルなどを省略しました。したがって、これらの Dockerfile からのビルドによって生成されたイメージは、最終的にローカルの Artifactory リポジトリに配置されます。これらのイメージをインスタンス化するために Rancher/Cattle を使用しています。Artifactory リポジトリを Rancher に追加して、そこからプルできるようにしました。Rancher の docker-compose.yml ファイルは次のようになります。

# The data/volumes container for the data.
data:
  image: data-image

# App
myapp:
  image: app-image
environment:
  DATA_VOL_PATH:
volumes_from:
  - data

docker-compose (上記の DATA_VOL_PATH のように) から環境変数を渡すことができることは知っていますが、どのように機能するかについては混乱しています。私の理解では、docker ビルドを実行すると Dockerfile 内のコマンドが実行され、その後、イメージは不変になります。イメージに基づいてコンテナーをインスタンス化すると、その上に新しい書き込み可能な UFS レイヤーが作成されます。つまり、データ コンテナーの場合、一度作成したボリュームを実際に変更することはできませんよね? その仮定が正しければ、要約すると、1) 2 つの異なるシステム (Docker イメージを作成するための Maven、およびコンテナー クラスターをインスタンス化するための Rancher) 間でユーザー ID を最適に同期するにはどうすればよいか、および 2) docker-compose から完全にデータ ボリューム コンテナー。yml? 次に、docker-compose.yml でデータ コンテナーの Dockerfile コンテンツを複製するにはどうすればよいでしょうか?

これはかなり一般的なシナリオだと思いますので、いくつかの「ベスト プラクティス」ソリューションが存在するはずです。ありがとう。

4

1 に答える 1

0

私もこの問題に遭遇しました:私の場合、Dockerコンテナ内に非ルートプロセスがあり、このプロセスはホストからマウントされたファイルにアクセスする必要があったため、Dockerイメージとホストの両方のUID/値に注意を払う必要がありましたGID.

残念ながら、良い決定はありません。Docker イメージは実際には不変であるため、ビルドとデプロイの両方のプロセスを制御するには、いくつかの合意を確立するか、サードパーティ ソフトウェアを使用する必要があります。

docker-composeまた、使用を中止して を試すことを強くお勧めしますSaltStack

于 2016-09-11T20:58:34.537 に答える