2017-08-11 133 views
0

我們正在嘗試爲python應用程序創建一個Docker容器。 Dockerfile使用「pip install」來安裝依賴項。該Dockerfile看起來像Docker重新編譯時間

FROM ubuntu:latest 
RUN apt-get update -y 
RUN apt-get install -y git wget python3-pip 
RUN mkdir /app 
COPY . /app 
RUN pip3 install asn1crypto 
RUN pip3 install cffi==1.10.0 
RUN pip3 install click==6.7 
RUN pip3 install conda==4.3.16 
RUN pip3 install Flask==0.12.2 
RUN pip3 install Flask-SSLify==0.1.5 
RUN pip3 install Flask-SSLify==0.1.5 
RUN pip3 install flask-restful==0.3.6 
WORKDIR /app 
ENTRYPOINT ["python3"] 
CMD [ "X.py", "/app/Y.yml" ] 

碼頭成功創建問題是在重建時間。

  • 如果沒有在dockerfile改變上述
  • 如果一行是在其中點子安裝搬運工守護進程仍然之後dockerfile改變運行所有的點子安裝命令,下載所有的包雖然不是安裝它們。

有沒有一種方法來優化重建?

THX

+2

如果由'COPY'命令複製一個文件碰巧它會創建一個新層,用新的散列和緩存不能再使用。嘗試移動「pip」調用下的「COPY」。 –

+2

我還建議閱讀[碼頭最佳實踐](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) - 碼頭文件還有其他一些問題,如書面 –

回答

2

下面是我想什麼用的Dockerfile優化暫時做 -

FROM ubuntu:latest 
RUN apt-get update -y && apt-get install -y \ 
    git \ 
    wget \ 
    python3-pip \ 
    && rm -rf /var/lib/apt/lists/* 
WORKDIR /app 
COPY ./requirements.txt . 
RUN pip3 install -r requirements.txt 
COPY . /app 
ENTRYPOINT ["python3"] 
CMD [ "X.py", "/app/Y.yml" ] 
  • 多個命令集成到一個單一的一個具體,當他們是相互依存的減少層。這有助於縮小圖像尺寸。
  • 總是嘗試在最後使用COPY,因爲常規的源代碼更改可能會使下一層緩存失效。
  • 使用單個requirements.txt文件通過pip進行安裝。還要定義單獨的步驟,以防萬一你有大量的軟件包需要安裝,不要讓一個普通的源代碼在每個版本上改變強制包的安裝。
  • 總是清理最終圖像中不需要的中間事物。

參考 - https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

+0

Won這個副本每次都會改變碼頭校驗和?COPY ./requirements.txt。 運行pip3安裝-r requirements.txt –

+0

@Vaibhav - 你認爲它會每次都會改變嗎? 我相信它不會每次都會改變,只有在「requirements.txt」文件中提交更改時它纔會更改。如果我們不做這個額外的步驟,正常的源代碼更改將強制每個構建包的安裝。 – vivekyad4v

+0

如果您看到上述評論,COPY ./app和COPY ./要求可能會有所不同。我雖然還沒有檢查。 –