2017-10-18 100 views
2

碼頭工新手試圖在碼頭集裝箱中開發;我有一個問題,每次我對代碼進行單行更改並嘗試重新運行容器時,docker都會重新構建需要很長時間的圖像,我應該如何正確設置項目才能最大限度地利用緩存?很確定,無需重新安裝所有apt-getpip install(每當我對源代碼進行一些更改時,我都在用python開發)。任何人都知道我錯過了什麼。感謝任何幫助。防止碼頭在更改代碼後從頭開始構建圖像

我現在的搬運工文件:

FROM tiangolo/uwsgi-nginx-flask:python3.6 

# Copy the current directory contents into the container at /app 
ADD ./app /app 

# Run python's package manager and install the flask package 
RUN apt-get update -y \ 
    && apt-get -y install default-jre \ 
    && apt-get install -y \ 
    build-essential \ 
    gfortran \ 
    libblas-dev \ 
    liblapack-dev \ 
    libxft-dev \ 
    && rm -rf /var/lib/apt/lists/* 

WORKDIR /app 
ADD ./requirements.txt /app/requirements.txt 
RUN pip3 install -r requirements.txt 
+0

推薦閱讀:[編寫Dockerfiles的最佳實踐](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) – jwodder

+0

對於代碼,您可以使用卷指向您的代碼 –

+0

我更喜歡將代碼包含到容器中,僅用於生產。對於開發,您可以在容器中安裝代碼 –

回答

4

一旦在Dockerfile緩存斷裂,以下所有線路將需要重建,因爲他們不再有高速緩存命中。緩存搜索會查找現有的先前層和相同的命令(或類似於COPY之類的內容)以重用緩存。如果兩者不匹配,那麼您的緩存未命中並執行構建步驟。對於您的情況,您只需要重新排序線,以確保經常變化的部分是在年底,而不是文件的開頭:

FROM tiangolo/uwsgi-nginx-flask:python3.6 

# Run python's package manager and install the flask package 
RUN apt-get update -y \ 
    && apt-get -y install default-jre \ 
    && apt-get install -y \ 
    build-essential \ 
    gfortran \ 
    libblas-dev \ 
    liblapack-dev \ 
    libxft-dev \ 
    && rm -rf /var/lib/apt/lists/* 

WORKDIR /app 
COPY requirements.txt /app/requirements.txt 
RUN pip3 install -r requirements.txt 

# Copy the current directory contents into the container at /app 
COPY app /app 

我還修改了ADDCOPY因爲你不不需要ADD提供的額外功能。

在開發過程中,我建議將應用程序作爲容器安裝在容器中,這樣您就不需要爲每次代碼更改重建圖像。您可以將COPY app /app保留在Dockerfile中,並且卷掛載將簡單地覆蓋該目錄,從而在該位置隱藏圖像中的任何內容。您只需重新啓動容器即可獲取修改。一旦完成,構建將創建一個與您的開發環境看起來相同的圖像。

+0

這很好。非常感謝。 *卷裝*似乎是一個非常好的開發策略。 – Psidom

相關問題