2016-09-08 5 views
1

私はドッカーの作成初心者の質問があります。 Dockerの画像を作成し、社内のArtifactoryリポジトリにプッシュする既存のJenkinsのビルドがあります。これは、Maven/Dockerと2つのDockerfiles(アプリケーション用とボリューム/データコンテナ用)を使用しています。Dockerfilesとdocker-compose.ymlの間の数値ユーザIDを同期させますか?

のApp::

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 

データコンテナ:Dockerfilesはこのような何かを見

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" ] 

を私は簡潔にするため、ラベル、などのようなものを省きます。したがって、これらのDockerfilesのビルドによって生成されたイメージは、ローカルのArtifactoryリポジトリになります。これらの画像をインスタンス化するためにRancher/Cattleを使用しています.RancherにArtifactoryリポジトリを追加して、そこから引き出すことができます。私は(上記DATA_VOL_PATHのように)ドッキングウィンドウ-コンからの環境変数を渡すことができることを知っているが、私はどのようなものにと困惑している

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

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

:二階建てでドッキングウィンドウ-compose.ymlファイルには、次のようになります作業。 Dockerビルドを実行するとDockerfileのコマンドが実行され、その後はイメージが変更されません。イメージに基づいてコンテナをインスタンス化すると、正しく理解していれば、その上に新しい書き込み可能なUFSレイヤーが作成されます。データコンテナの場合は、作成したボリュームを実際に変更することはできません。その仮定が正しい場合は、1)2つの異なるシステム(Dockerイメージを作成するMavenとコンテナクラスターをインスタンス化するRancher)でユーザーIDを最適に同期させるにはどうすればよいか、2)データボリュームコンテナは完全にdocker-compose.ymlからですか?それでは、データ・コンテナのDockerfileコンテンツをdocker-compose.ymlに複製する方法はありますか?

これはかなり一般的なシナリオであると想定しています。そのため、そこにはいくつかの「ベストプラクティス」ソリューションが必要です。ありがとう。

+1

あなたの質問は混乱しています。ボリュームはコンテナによって作成され(作成するのではなく)、あなたが望むユーザにそれらを 'chown 'することができます。両方のコンテナに同じユーザーがいるので、それらの間のIOには問題はありません。ホストシステムの何かについては、なぜあなたはホストシステム上に何か必要なのでしょうか?ドッカー画像を作成する同じUIDの下でコンテナを実行させることができます。しかし、いずれの場合でも、ホストシステム上に作成された同じUIDを持つことができます。 UIDを制御していない他のコンテナを使用している場合は、難易度が問題になります。 –

+0

Oleg、私はDockerfileとdocker-compose.ymlの使用の間の相関について少し混乱しています。そのため質問自体が混乱しているかもしれません。たぶん私は質問を言い返し、もう一方の端から始めるべきです。私はまた、名前付きのボリュームがこれを行うための好ましい方法だと言われてきました。私はまだ混乱していますが、やや啓示された方法で:-) – user2337270

+0

あなたは答えを得ていません。おそらく、人々はあなたが求めているものを理解していないということです。私はあなたが繰り返し学習することをお勧めします:あなたのJenkinsのビルドから離れ、最初にdocker.comのチュートリアルを読んでから、あなた自身のいくつかのコンテナを作成し、それらを一緒にリンクしてください。その瞬間、あなたは基本を理解することになり、Jenkinsの設定を理解することができます。その瞬間に未解決の問題が残っている場合は、カスタムJenkins/maven /何らかのセットアップの詳細があまりにも多くなく、一度に一番重要な質問をしてください。 –

答えて

0

私の場合、Dockerコンテナ内にルート以外のプロセスがあり、このプロセスでホストからマウントされたファイルにアクセスする必要があったため、UID/GIDの値に注意しなければならなかったDockerイメージとホストの両方にあります。

私はそれのための良い決定がないことを恐れています。 Dockerイメージは本当に不変なので、いくつかの合意を確立するか、サードパーティのソフトウェアを使用して構築プロセスと展開プロセスの両方を制御する必要があります。

docker-composeの使用をやめて、SaltStackを試してみることを強くお勧めします。

+0

SaltStackへのスイッチが、単純な構成ファイルによって制御されるこのかなり簡単な運動にどのように有益でしょうか?学習して設定する時間と生産性、明快さ、またはシンプルさを増やしてください。 –

+0

職場の誰かが私にこの会話を指摘しました。私は本質的に名前付きボリュームが行く方法だと思う: https://github.com/docker/docker/issues/17798 – user2337270

関連する問題