2017-06-04 16 views
4

私はDockerfileを作成しています。このファイルの一部として、git repoを渡すオプションをエンドユーザに与えたいと思っています。gitクローンを実行しているシェルスクリプトに変数を渡しているDocker

私はthis SO postといくつかの他のサイトを見ましたが、git cloneの構文に固執しています。

git cloneコマンドは、その一部である変数にdocker buildステージの値が含まれていないため、エラーを返します。

は私が

#!/bin/bash 
git clone $1 /app 

と私のDockerfileで

私はこのラインを持っているgitclone.shと呼ばれるこのbashスクリプトを持っている:

RUN ./gitclone.sh $LOCATION

シェルスクリプトを実行するために必要な権限を持つ、それが動作します実際のリポジトリを渡しているので、コンテナ内から実行しています。

fatal: repository '/app' does not exist

ディレクトリがあるが、$1はコマンドが動作しないために、空である:私は次のエラーを取得するドッカー構築フェーズで

質問 ドッカーファイルを機能させるにはどうすればよいですか?私はそれをしたい所望の出力:

docker run -e LOCATION=https://github.com/something.git -d jwknz/pg02

UPDATE CMD ["../gitclone.sh","$LOCATION"]代わりのRUN ./gitclone.sh $LOCATIONはそれを修正しない含まれているために、私のDockerfileを変更します。

Dockerファイルは作成されますが、docker runコマンドの実行後にコンテナが停止します。

+0

私はあなたがやろうとしていることを本当に理解していません.Dockerfileは画像をどのように作成するのかをDockerに伝え、 'docker run'は既に構築された画像から新しいコンテナを開始します。 'RUN'コマンドは、画像の構築中に実行されます。イメージの構築中に実行コマンドに環境変数を渡してしまったのですか、何か不足していますか? –

+0

私が望むのは、dockerを実行してgit URLを取得し、docker runでクローンしますが、-eパラメーターを使用して渡したい場合です。 –

+0

OK。次に、イメージの構築中に、しかしそこからコンテナの開始中にレポをクローンしたくないです。コンテナの起動時に実行されるentrypoint.shスクリプトを定義できます。私はこれを少し答えて文書化しようとします。 –

答えて

1

最初に、イメージを構築するのに(docker buildコマンドで)Dockerfileが使用され、すでにビルドドッカーイメージからコンテナを開始するのにdocker runが使用されていることに注意してください。

エントリポイントスクリプトを定義する必要があります。これは、コンテナが、Dockerfileでビルドしたイメージから開始されるたびに実行されるスクリプトです。

git repoをクローンしてapache httpdを実行すると仮定すると、Dockerfileと同じフォルダにこのようなスクリプトを作成できます。名前を付けてください(例: gitCloneAndRunHttpd.sh

#!/bin/bash 

git clone $LOCATION /app 
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf 

その後、あなたは、コンテナの作成時にそれを実行するよう指示エン、それが実行可能にし、あなたのドッキングウィンドウのイメージにスクリプトファイルをコピーするためにドッキングウィンドウを伝えるあなたのDockerfileを変更する必要があります。この後

[...] 

COPY ["gitCloneAndRunHttpd.sh", "/gitCloneAndRunHttpd.sh"] 
RUN chmod +x /gitCloneAndRunHttpd.sh 
ENTRYPOINT ["/gitCloneAndRunHttpd.sh"] 

をドッカーの画像をドッカーのbuildコマンドで作成すると、イメージからコンテナの作成を開始できます。

あなたはdocker run -e LOCATION=https://github.com/some-git-repo.url -d your/imageでそれからコンテナを起動するたびに、レポhttps://github.com/some-git-repo.urlは、/ appフォルダおよびApache HTTPDにコンテナ内からクローニングされますが開始されます。

注:あなたが言及したSO postで何が起こっているのか疑問に思っている場合は、そこにデフォルトエントリポイント(/ binに/ SH)を用い、/file.sh abcしたがって、file.shそのエントリポイントに渡される引数ですスクリプトが実行されます。

+0

私はしばらくプレイしていて、コマンドを実行した後も「終了」状態を維持しています。 '終了(128)2秒前'とコンテナは –

+1

の後に開始しませんまた、 'ENTRYPOINT'はどのパラメータを使用するのか知っていますか? 2つのシェルスクリプトがあればどうなりますか? –

+0

イメージを構築したり、コンテナを開始したりするときにエラーが発生しますか? –

関連する問題