2016-12-09 10 views
0

私は、一連のサービスを構築して実行するためにドッカーを使用しています。これらのうちの1つについては、内部(gulp.js)ビルドプロセスを完了するためにいくつかのパッケージをインストールする必要がありますが、最終的なドッカーイメージでは不要です。イメージを小さくするために、ドッカーイメージを構築している間にアンインストールする必要があるようです。これには標準的なプラクティスがありますか?ドッカー内のアプリケーションをアンインストールしますか?

関連性:ドッカー画像に適したサイズはどれくらいですか?私は "合理的"が主観的だと気づいていますが、1.4GBのサウンドは野生ですか?

これは、今存在しているように私Dockerfileです:

FROM python:3.5.1-onbuild 
ARG mode=dev 

ENV MODE $mode 

RUN apt-get update && apt-get install -y \ 
    build-essential \ 
    curl \ 
    && rm -rf /var/lib/apt/lists/* 
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash 
RUN apt-get install -y nodejs 
RUN cd $(npm root -g)/npm \ 
    && npm install fs-extra \ 
    && sed -i -e s/graceful-fs/fs-extra/ -e s/fs\.rename/fs.move/ ./lib/utils/rename.js 


WORKDIR /usr/src/app/app 
RUN npm install 
RUN npm install --global gulp-cli 
RUN npm rebuild node-sass 
RUN gulp 
RUN rm -rf node_modules 

WORKDIR /usr/src/app 
EXPOSE 8080 
RUN python3 setup.py install 
CMD python3 manage.py ${MODE} 
+0

ダウン投票している場合は、なぜ便利な言葉を教えていただけますか?フロントエンドを使用して1つの画像にバックアップされています。 – ebbishop

+0

もしそうなら、あなたはイメージサイズを減らす2つの異なるイメージを作成することができます。イメージはもっと速くビルドされます。または、3.5インチアルパイン(29 MB)の小さなサイズのPythonを使用できます:3.5.1-onbuild。しかし、あなたはあなたのDockerfileを変更する必要があります – Deepak

答えて

2

ドッカー画像は、階層化ファイルシステムを使用しています。 Dockerfileの各ステートメントは、生成されたイメージに新しいレイヤーを追加します。これらのレイヤーはdocker historyコマンドで検査できます。

ビルドステップでパッケージを削除しても、削除されたファイルは親レイヤー内に残るため、イメージ全体のサイズは縮小されません(ファイルは削除済みとしてマークされますが、画像)。

が短い例を考える:

FROM debian:8 
RUN dd if=/dev/zero of=/tmp/test bs=1024 count=100K 
RUN rm /tmp/test 

この例Dockerfile最初RUNステートメント100 MIBファイルとイメージを作成し、第二RUN文でそれを除去します。今docker history <image-id>で作成したイメージを検査:あなたが見ることができるように、100MiB層がまだそこにある

IMAGE    CREATED    CREATED BY          SIZE    COMMENT 
02b8c1077ac1  8 seconds ago  /bin/sh -c rm /tmp/test       0 B     
64a98e72b7ca  8 seconds ago  /bin/sh -c dd if=/dev/zero of=/tmp/test bs=10 104.9 MB    
737e719de6a4  4 weeks ago   /bin/sh -C#(nop) CMD ["/bin/bash"]   0 B     
1f2a121fc3e4  4 weeks ago   /bin/sh -C#(nop) ADD file:41ea5187c50116884c 123 MB  

。あなたのnpm installコマンド確認とそれに続くください

  1. :私はあなたのイメージのサイズを小さくするために2つの可能性を参照してくださいどのように

    を修正する

    REPOSITORY   TAG  IMAGE ID   CREATED    VIRTUAL SIZE 
    <none>    <none> 02b8c1077ac1  8 minutes ago  227.9 MB 
    

    :結果の画像は、およそ200メガバイトの全体的な大きさを持っています同じビルドステップでrm -rf node_modulesを実行します。

    RUN npm install && \ 
        npm install --global gulp-cli && \ 
        npm rebuild node-sass && \ 
        gulp && \ 
        rm -rf node_modules 
    

    このステートメントは、node_modulesディレクトリのない、結果のイメージに1つのファイルシステムレイヤーしか作成しません。

  2. "スカッシュ"画像レイヤーを1つにまとめます。 のようなツールがこれに役立ちます。画像レイヤーを潰すと、(通常はきわめて効率的な)操作が効率的になりません。docker pushdocker pull通常、これらの操作は、ローカル(pull)のときまたはリモート(push)のときに存在しない画像の特定のレイヤーのみを転送します。画像が1つのレイヤーのみで構成される場合、docker pushpullは常に画像全体を転送します。

+0

私は 'docker-squash'をもっと探していますが、あなたが示唆するようにrun文を組み合わせることで大幅な節約になります。 – ebbishop

関連する問題