簡體   English   中英

如何將代碼從Git更新到Docker容器

[英]How to update code from Git to a Docker container

我有一個Docker文件試圖將Django代碼部署到容器中

FROM ubuntu:latest
MAINTAINER { myname }

#RUN echo "deb http://archive.ubuntu.com/ubuntu/ $(lsb_release -sc) main universe" >> /etc/apt/sou$

RUN apt-get update

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y tar git curl dialog wget net-tools nano buil$
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python python-dev python-distribute python-p$

RUN mkdir /opt/app
WORKDIR /opt/app

#Pull Code
RUN git clone git@bitbucket.org/{user}/{repo}

RUN pip install -r website/requirements.txt

#EXPOSE = ["8000"]
CMD python website/manage.py runserver 0.0.0.0:8000

然后我將我的代碼docker build -t dockerhubaccount/demo:v1 . ,這將我的代碼從Bitbucket拉到容器中。 我運行它作為docker run -p 8000:8080 -td felixcheruiyot/demo:v1 ,事情似乎工作正常。

現在我想更新代碼,即因為我使用git clone ... ,我有這樣的困惑:

  • 當我有新的提交時,如何更新我的代碼,並且在Docker容器構建它時附帶新代碼(注意:當我運行構建時,它不會因為緩存而獲取它)。
  • 這種方法的最佳工作流程是什么?

您可以使用幾種方法。

  1. 您可以使用docker build --no-cache來避免使用Git克隆的緩存。
  2. 啟動命令調用git pull 因此,不是運行python manage.py ,而是使用CMD cd /repo && git pull && python manage.py或者如果事情更復雜則使用啟動腳本。

我傾向於選擇2.你也可以運行一個cron作業來更新你容器中的代碼,但這樣做的工作要多一些,並且有點違背了Docker的理念。

我建議您檢查主機上的代碼並將其COPY到圖像中。 這樣,無論何時進行更改,它都會更新。 此外,在開發期間,您可以將源目錄綁定到容器中的代碼目錄,這意味着任何更改都會立即反映在容器中。

檢查上次更新的git存儲庫的docker命令雖然非常有用!

另一種方法。

只要指令字符串與緩存圖像完全相同,Docker構建命令就會使用緩存。 所以,如果你寫

RUN echo '2014122400' >/dev/null && git pull ...

在下次更新時,您將更改如下。

RUN echo '2014122501' >/dev/null && git pull ...

這可以防止docker使用緩存。

我想提供另一種可能的解決方案。 我需要提醒一下,它肯定不是處理器的“對接方式”,而是依賴於卷的存在(這可能是Docker Swarm和Kubernetes等工具的潛在阻礙)

我們將利用的基本原則是,用作Docker Volumes的容器目錄的內容實際上存儲在主機的文件系統中。 查看文檔的這一部分。

在您的情況下,您將使用/opt/app Docker Volume。 您不需要將Volume顯式映射到主機文件系統上的某個位置,因為我將在下面介紹,可以動態獲取映射。

因此,對於初學者來說,完全保留Dockerfile,並將容器創建命令切換為:

docker run -p 8000:8080 -v /opt/app --name some-name -td felixcheruiyot/demo:v1

命令docker inspect -f {{index .Volumes "/opt/webapp"}} some-name將在存儲代碼的主機上打印完整的文件系統路徑( 是我選擇檢查技巧的地方)。

有了這些知識,你所需要做的就是替換那些代碼和你的所有代碼。 所以一個非常簡單的部署腳本將是這樣的:

code_path=$(docker inspect -f {{index .Volumes "/opt/webapp"}} some-name)
rm -rfv $code_path/*
cd $code_path
git clone git@bitbucket.org/{user}/{repo}

使用這種方法可以獲得的好處是:

  • 沒有潛在的昂貴的無緩存圖像重建
  • 無需將特定於應用程序的運行信息移動到run命令中。 Dockerfile是檢測應用程序所需的唯一來源

UPDATE

您可以使用docker cp (啟動Docker 1.8)獲得上面提到的相同結果。 這樣容器不需要有卷,您可以像在主機文件系統上一樣替換容器中的代碼。

當然,正如我在回答的開頭所提到的,這不是做事的“對接方式”,它主張容器是不可變的和可重復的。

如果使用GitHub,則可以使用GitHub API來緩存特定的RUN命令。

你需要安裝jq來解析JSON: apt-get install -y jq

例:

docker build --build-arg SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | jq -r '.[0].sha') -t imageName .

在Dockerfile中(ARG命令應該在RUN之前):

ARG SHA=LATEST
RUN SHA=${SHA} \
    git clone https://github.com/Tencent/mars.git

或者如果您不想安裝jq:

SHA=$(curl -s 'https://api.github.com/repos/Tencent/mars/commits' | grep sha | head -1)

如果存儲庫有新的提交,則將執行git clone

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM