2016-01-04 49 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/

相关问题