8

私は Docker を使用して、その場でファイルを書き込んで実行しています。これまでのところ、コマンドは次のようになっています (最初にアイデアをテストするためだけです)。

docker run dockerfile/python cat <<EOF >hi.txt && tail hi.txt
> hi there
> EOF

何らかの理由で、これは何もエコーしません。

HEREDOC なしでこのコマンドを実行すると、結果が出力されます。たとえば、次のように動作します。

docker run dockerfile/python cat > hi.txt && ls
hi.txt

複数行の実行コマンド/HEREDOC の結果を出力するにはどうすればよいですか。

4

2 に答える 2

4

私はcrossbuild * をいじっていましたが、ヒア ドキュメントを使用してコマンドを Docker コンテナーにパイプする方法について疑問に思っていました。これが解決策です。

$ docker run --rm --interactive --volume $(pwd):/workdir --env CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s <<EOF
mkdir build && cd build
cmake ..
make
EOF

何が起こっているかの簡単な要約。

  • --rm実行が終了したときにコンテナーを削除するように Docker に指示します。そうしないと、出力に表示されますdocker ps -a(もちろん、必須ではありません)。
  • --interactive-i必要です。そう/bin/bashしないと、インタラクティブな環境で実行されず、stdin からのヒア ドキュメントを入力として受け入れません。
  • -s渡されるフラグについて/bin/bash

    -s オプションが存在する場合、またはオプション処理後に引数が残っていない場合、コマンドは標準入力から読み取られます。

  • --volume $(pwd):/workdir-v、ホストの現在の作業ディレクトリを/workdirコンテナにマウントするだけです
  • --env CROSS_TRIPLE=x86_64-apple-darwin、または単純に、ターゲット プラットフォームとアーキテクチャ-eについてcrossbuildコンテナーに通知します (コンテナーのエントリ ポイントは/usr/bin/crossbuild、シェル スクリプトであり、環境変数に基づいて、適切なツールチェーン コンポーネントを適切な場所にシンボリック リンクし、クロス コンパイルが機能するようにします)。
  • multiarch/crossbuild実行する Docker コンテナーの名前 (Docker Hub で利用可能)

コマンドは、このように Docker にフィードすることもできます。

$ cat a.sh
mkdir build && cd build
cmake ..
make
$ docker run --rm -i -v $(pwd):/workdir -e CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s < a.sh

これが役立つことを願っています。

アップデート

実際には、使用する必要さえないようです。/bin/bash -s少なくともcrossbuildコンテナー YMMV については省略できます。

*マルチアーキテクチャ バイナリの生成に使用される Linux ベースのコンテナ: Linux、Windows、OS X、非常にクール。

于 2016-03-03T09:05:36.473 に答える
3

2 番目のコマンドが機能するように、どのシェルを使用していますか? bash ではhi.txtがホスト上に作成され、ls.

bash-3.2$ docker run --rm dockerfile/python cat > hi.txt && ls
Applications    Desktop     Documents   Downloads   Dropbox     Library     Movies      Music       Pictures    Public      VirtualBox VMs  hi.txt      projects

それを達成するには、次を使用する必要があります。

docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls'

IMO、ものをテストする最も簡単な方法は、コンテナーをサンドボックスとして使用することです。

docker run -it dockerfile/python bash

そして、そのコンテナのシェルで何かをするだけです。うまく動作するようになったら、Dockerfile で行ったことをバックポートします。

于 2014-12-09T11:13:46.103 に答える