2016-01-04 66 views
0

我有一個碼頭主機。我還有一個通過運行run命令創建的容器。我沒有使用docker文件,因爲我還沒有學習docker。應用程序文件的位置 - Docker

我的問題是,如果我打算在基於Ubuntu映像的容器中運行應用程序,是否應該從容器中克隆該應用程序的git文件(當我以交互方式進入該應用程序時)或應該容器以某種方式讀取碼頭主機中的文件,因此將文件克隆到碼頭主機上的目錄中?容器應該如何運行應用程序文件以及這些文件應該克隆到哪裏?

回答

2

我還沒有使用docker文件,因爲我還沒有學習docker。

這是一個錯誤。碼頭集裝箱不是虛擬機。實際上,從圖像中創建圖像並運行容器是Docker所關心的。 Dockerfile reference是一個相當可讀的介紹,在底部有一些優秀的,簡單的例子。這就是說:如果這是你的代碼,那麼它可以生活在任何你建立你的碼頭圖像,然後在Dockerfile中使用ADD將你的代碼(或二進制文件)複製到圖像中(如果你正在開發你的應用程序並使用容器進行測試,然後使用VOLUME安裝該應用程序是很常見的)。

如果這是「只是一些混帳回購」,你只是想將其建成你可以在Dockerfile使用RUN git clone你會使用git clone本地相同的方式,圖像(假設你的形象已經在它git和如果它不只是像使用RUN命令一樣安裝git--儘管您通常希望確保通過-y--noconfirm或任何操作系統軟件包管理器爲 「不要問我」只是做'旗)。

一個Dockerfile只是一個步驟,以建立一個OS圖像列表:如果你可以在一個虛擬機做運行的操作系統,你可以在Dockerfile一個RUN做到這一點:如果源是在Git中你可以git clone(如果它的源代碼需要編譯,你甚至可以在你的Dockerfile中運行編譯權限),或者如果它是以zip的形式發佈的,你可以簡單地使用curl並安裝。

我沒有Dockerfile的做一個克隆的例子,但向你展示一些你可以在Dockerfile做什麼這裏是我的一個與操作系統包管理器安裝tar,然後下載並通過安裝javacurl和OS包管理器,然後下載並解壓縮2個柏油檔案:

FROM centos:centos6 

RUN set -x    && \ 
    yum install -y tar && \ 
    yum clean all 

RUN set -x  && \ 
    curl -sOL 'http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-x64.rpm' \ 
     -H 'Cookie: oraclelicense=accept-securebackup-cookie' && \ 
    rpm -i jdk-7u51-linux-x64.rpm && \ 
    rm jdk-7u51-linux-x64.rpm && \ 
    echo 'export JAVA_HOME=/usr/java/jdk1.7.0_51/' >> ~/.bashrc 

ENV HBASE_VERSION 0.94.24 
RUN set -x   && \ 
    curl -L http://archive.apache.org/dist/hbase/hbase-$HBASE_VERSION/hbase-$HBASE_VERSION.tar.gz | \ 
    tar zvx --null && \ 
    echo "export HBASE_HOME=/hbase-$HBASE_VERSION" >> ~/.bashrc 

ADD hbase-site.xml /hbase-$HBASE_VERSION/conf/hbase-site.xml 
ADD run.sh /hbase-$HBASE_VERSION/bin/LOCAL-run.sh 

ENV PHOENIX_VERSION 3.2.0 
RUN set -x && \ 
    curl -L http://archive.apache.org/dist/phoenix/phoenix-$PHOENIX_VERSION/bin/phoenix-$PHOENIX_VERSION-bin.tar.gz | \ 
    tar zvx --null && \ 
    cp /phoenix-$PHOENIX_VERSION-bin/common/phoenix-core-$PHOENIX_VERSION.jar /hbase-$HBASE_VERSION/lib/ 


CMD ["/hbase-0.94.24/bin/LOCAL-run.sh"] 
+0

是的我讀過所有這些,我誤解了一些容器。謝謝 – PositiveGuy

+0

是啊,所以無論你從哪裏建立你的碼頭圖像通常來自你的碼頭主機虛擬機我認爲 – PositiveGuy

+0

所以最終,你說的是一個應用程序,住在github,我會克隆它到我的主機。然後在docker文件中添加它,因此容器在該路徑中有一個代碼副本。 Makese有意義,因爲如果代碼在主機上發生變化,它不會影響我測試的容器,因爲它在特定時間有一個COPY的文件。 – PositiveGuy

1

可以通過提供-v選項來運行命令
$ docker run -v <path on host> : <path inside container> <image name>
運行容器這將安裝容器內部的路徑p ath在主機上。
關於應用程序文件克隆,探索dockerfile是不錯的。 ADD選項將解決您的問題。

+0

人們通常只是將映射到克隆到例如Git的主機的代碼中,還是將文件克隆到容器的文件系統?只是想知道好的做法或者通常人們在那裏做什麼,或者如果它試圖將其克隆到容器中是非常有意義的 – PositiveGuy

+0

感謝這一點,我也可以玩這個,如果我不'我不想創建我的docker文件。只需讓容器首先與安裝路徑對話即可使應用程序正常工作。然後繼續創建一個dockerfile並做對。 – PositiveGuy

+0

除非您正在積極開發代碼並使用容器對其進行測試(例如,在容器中運行Apache並在本地文件系統上修改某些Web代碼),否則這是將容量安裝到容器中的反模式。 – Guildencrantz

0

您可以在構建過程中從容器內安裝應用程序或複製它(使用COPY不會添加,除非您有很好的理由https://labs.ctl.io/dockerfile-add-vs-copy/)。他們都是有效的方式來做到這一點。

答案取決於您想從容器中實現的目標。創建一個新的容器,你偶爾或經常做的事。你會在某些時候與其他人分享這張照片嗎? Dockerfiles非常適合可重複的任務。每次構建時,都會使用相同的一致步驟創建圖像。我建議學習編寫一個Dockerfile作爲你學習的一部分。

你當然可以在容器中手動完成一次設置,然後提交併推送它。這樣你(或其他人)可以稍後再拉它並從那一點繼續。見https://docs.docker.com/engine/reference/commandline/commit/

相關問題