2016-09-12 10 views
2

私が直面している問題は、引数を持つコマンドをdocker runに渡す方法です。問題は、docker runがコマンド+引数を単一の文字列として受け取らないということです。しかし、変数の値としてコマンドと引数を考慮引数を持つコマンドをドッカーに渡す文字列として渡す

#!/bin/bash 
docker run --rm -it myImage bash -c "(cd build && make)" 

:彼らは、次のような、docker runに個々のファーストクラスの引数として提供される必要が

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

残念ながら、これは動作しません。

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
docker: Error response from daemon: oci runtime error: exec: "bash -c \"(cd build && make)\"": stat bash -c "(cd build && make)": no such file or directory. 

わずかな変化、DOCKER_COMMANDの引用を取り除く:docker runは、置換を理解していないので。中

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage $DOCKER_COMMAND 

結果:

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
build: -c: line 0: unexpected EOF while looking for matching `"' 
build: -c: line 1: syntax error: unexpected end of file 

それは、スクリプト内のdocker runに個別のコマンドと引数として渡されるようにどのように私は変数から文字列を拡張することができますか?

+0

質問を最小限に抑える必要があります。 (例:ドッカーが関与することが重要な理由)私にとっては、「環境変数を使用してスクリプトにパラメータを解析するにはどうすればよいですか?" –

+0

@MichaWiedenmannあなたのコメントをありがとうございます。実際には、Dockerが引数を受け入れる方法と、環境変数からこれらを抽出する方法があります。通常、ほとんどのコマンドは引用符付きの文字列から構築できますが、 – meowsqueak

+0

@MichaWiedenmann ok、かなり簡略化しました。 – meowsqueak

答えて

2

あるdocker runコマンドの構文でスタート:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] 

これは、あなたが実行した場合を意味します

DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

あなたはCOMMANDとして$DOCKER_COMMAND変数の全体を渡しています。 Dockerに名前bash -c "(cd build && make)"と一致するファイルを検索するよう要求しているので、失敗することは驚くべきことではありません。それは "ドッカーの実行は置換を理解していません"とは何の関係もありません。これは、シェルがコマンドラインを実行する前に解析する方法に関連しています。

あなたは$DOCKER_COMMANDの前後に引用符を削除すると、あなたはこのようにそれを呼び出すに終わる(私はそれを明らかにするために別の行に各引数を入れている):

docker 
run 
--rm 
-it 
myImage 
bash 
-c 
"(cd 
build 
&& 
make)" 

そして、それが動作するつもりはありません、 bashがunexpected EOF while looking for matching「のための明白な理由をしなければならないスクリプト"(cdを実行しようとしているので、」error. Bash's -c`オプションは、単一の引数を取りますが、方法が原因のシェル拡張のそれは4

を得るの作品あなたはこのようにすることができます:

DOCKER_COMMAND='cd build && make' 
docker run --rm -it myImage bash -c "$DOCKER_COMMAND" 

は(彼らは何でもあなたがそれらを使用している方法をしないので、私はあなたのコマンドを囲む括弧を削除しました。)

この方法で、あなたはbashのコマンドでdocker runを呼んでいます、 bashの-cオプションに1つの引数($DOCKER_COMMAND変数の内容)を与えています。

+0

この2つのフォームの違いを理解するのに役立ちますので、特に説明してくれてありがとうございます。 'bash -c'は私のアプリケーションによく合います。 – meowsqueak

関連する問題