2017-01-01 9 views
7

DockerfileでRUN文をデバッグしようとしているときに、出力をバインドされたボリューム(./mongo/log)のファイルにリダイレクトしようとしました。Docker:RUN touchでファイルが作成されない

驚いたことに私は、演算子(>>>)リダイレクション/添付を使用してファイルにRUNコマンドを使って、またはパイプに別のコマンドの出力をファイルを作成することができませんでした。しかし、私は実行中のコンテナにdocker exec -ti mycontainer /bin/shでログインしてそこからコマンドを発行することで、上記のタスクを実行することができました。

この現象はなぜ発生しますか? Dockerfile/redirect出力のファイルを、Dockerfileが実行されているファイルまたはコンソールにタッチするにはどうすればよいですか?ここで

FROM mongo:3.4 

#Installing NodeJS 
    RUN apt-get update && \ 
    apt-get install -y curl && \ 
    curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ 
    apt-get install -y nodejs 


#Setting Up Mongo 
    WORKDIR /var/www/smq 
    COPY ./mongo-setup.js mongo-setup.js 

    ##for testing 
    RUN touch /var/log/node.log &&/
     node --help 2>&1 > /var/log/node.log 

    ##this was the command to debug 
    #RUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log 

私のドッキングウィンドウ-compose.ymlからの抜粋:ここ

は私Dockerfileある

mongodb: 
    build: 
     context: ./ 
     dockerfile: ./mongodb-dockerfile 
    container_name: smqmongodb 
    volumes: 
    - /var/lib/mongodb/data 
    - ./mongo/log/:/var/log/ 
    - ../.config:/var/www/.config 
+0

中間ビルド手順のキャッシュについては、https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/を参照してください。それはうまく機能するように設計されています。あなたはそれを別の方法で動作させたいと思うようです。ドッカーがキャッシュを使用しないようにビルドに指示することは可能ですが(上記のリンクで習得できるように、 '--no-cache = true'を指定)、Dockerfileを作成して活用する方法を見直すことをお勧めしますキャッシング機能 –

+0

クールな読書! Dockerfileを更新しましょう。私の素早い読書から、それは私の問題を解決するようではありませんか? –

+0

@Phillipe - 私が言及したパラメータは問題を解決すべきです - キャッシングを無効にするので、 "touch"はすべての単一ビルドで実行されます。しかし、キャッシュを無効にすることなく目標を達成できる他の方法があるかもしれません... –

答えて

4

代わりのRUN node mongo-setup.js > /var/log/mongo-setup.log 2> /var/log/mongo-setup.error.log、コンテナ内の、あなただけの何を言うならば、 `RUNノードmongo-setup.js '?

docker logsを使用することをお勧めします。これと同じように:

docker logs container-name 

はあなたが後にしている何を達成するためにあなたが別々のストリームをパイプすることにより、コンテナの標準出力&標準エラー出力を分割することができ、(?モンゴのセットアップログを参照してください):とファイルに送信:

[email protected]~$ docker logs foo > stdout.log 2>stderr.log 

[email protected]~$ cat stdout.log 
[email protected]~$ cat stderr.log 

また、あなたが、ビルド時にこれをやっているdocker logs documentation

+1

興味深いことに、私はdocker-compose(およびドッカーのログがどのように動作するか)でこれがどのように達成されるかについて少し研究し、結果をここに掲載します。 –

+0

いくつかの調査の後、私は、ドッキングでロギングがどのように行われるかを概要で説明しているこの素敵な記事を見つけました:https://medium.com/@yoanis_gil/logging-with-docker-part-1-b23ef1443aac#.q7macfaym 今私はドッカーのドッキングの観点からの戦略。知ってよかった! –

+0

私はsyslogログオプションを設定していましたが、なんらかの理由で障害のあるコマンド(ノードmongo-setup.js)からいくつかのプリントを開始しました。だから、私はsyslogを用意して、このようなロギングシステムを使用したいときはいつでも準備ができていて、そうでなければ私のコマンドはコンソールに表示されます。もう一度お返事ありがとうございます:) –

7

を参照してください。

RUN touch /var/log/node.log &&/
    node --help 2>&1 > /var/log/node.log 

ファイル/var/log/node.logが作成され、結果のイメージに固定的に固定されます。

その後、あなたは、このボリュームでコンテナを実行するには、マウント:

volumes: 
    - ./mongo/log/:/var/log/ 

./mongo/log/にあるもの(画像からの)前にあったものは何でも隠し容器内に/var/logとして実装されています。これはあなたのtouchがうまくいかなかったように見えるようになっています。

あなたはこれを逆に考えています。ボリュームマウントでは、コンテナのバージョン/var/logが外部に公開されません。そこにあったものはすべて置き換えられます。

Dockerfile(ビルド)で行うことは、これまでに外部マウントに表示されることはありません。

+0

あなたの答えはah-haです!瞬間素晴らしい説明。明確で、簡潔で、ポイントまで。今、私はブルノ・レイがOPの下での彼のコメントの意味を理解しています。 最終的にソクラテスの回答が私の伐採問題の解決策を提供して以来、私は彼を受け入れられた解決策にしていきます。しかし、あなたの答えはちょうど有益で価値があります。乾杯! –

関連する問題