存放应用程序文件的位置 - Docker
Posted
技术标签:
【中文标题】存放应用程序文件的位置 - Docker【英文标题】:Where to hold Application Files - Docker 【发布时间】:2016-01-04 01:54:11 【问题描述】:我有一个 docker 主机。我还有一个通过运行 run 命令创建的容器。我还没有使用 docker 文件,因为我还没到那里,正在学习 docker。
我的问题是,如果我打算在基于 ubuntu 映像的容器中运行应用程序,我应该从容器内部克隆该应用程序的 git 文件(当我以交互方式进入它时)还是应该容器以某种方式从 docker 主机读取文件,因此将我的文件克隆到 docker 主机上的目录中?容器应该如何运行应用程序文件以及这些文件应该克隆到哪里?
【问题讨论】:
【参考方案1】:我还没有使用 docker 文件,因为我还没到那里,学习 docker。
这是一个错误。 docker 容器不是虚拟机。实际上,创建一个镜像并从该镜像运行容器就是 docker 的意义所在。 Dockerfile reference 是一个可读性很强的介绍,底部有一些优秀、简单的示例。
话虽如此:如果这是您的代码,那么无论您从哪里构建 docker 映像,它都可以存在,然后在 Dockerfile 中使用 ADD
将您的代码(或二进制文件)复制到映像中(如果您正在开发您的应用程序并使用容器进行测试然后使用VOLUME
挂载应用程序是常见的)。
如果这只是“一些 git repo”并且您只是想将其构建到镜像中,您可以在 Dockerfile 中使用 RUN git clone
,就像在本地使用 git clone
一样(假设您的镜像已经有 @987654326 @ 在其中,如果它不只是使用 RUN
命令来安装 git
就像你通常那样——尽管你通常希望确保通过 -y
或 --noconfirm
或任何操作系统包管理器需要一个
'不要问我,就去做' 标志)。
Dockerfile 只是构建操作系统映像的步骤列表:如果您可以在运行该操作系统的 VM 中执行此操作,您可以在 Dockerfile 中使用RUN
执行此操作:如果源在 git 中,您可以@ 987654332@(如果它是需要编译的源代码,您甚至可以直接在 Dockerfile 中运行编译),或者如果它以 zip 的形式分发,您可以简单地 curl
并安装。
我没有 Dockerfile 进行克隆的示例,但是为了向您展示您可以在 Dockerfile 中执行的一些操作,这是我的一个,它使用 OS 包管理器安装 tar
,然后下载并安装 @ 987654335@ 通过curl
和 OS 包管理器,然后下载并解压两个 tar 文件:
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"]
【讨论】:
是的,我已经阅读了所有内容,我对容器有点误解了。谢谢 是的,所以无论您从哪里构建 docker 映像,我认为通常来自您的 docker 主机 vm 所以最终,您是说对于 github 中的应用程序,我会将其克隆到我的主机。然后在 docker 文件中,添加它,因此容器在该路径中具有代码的副本。这是有道理的,因为如果主机上的代码发生更改,它不会影响我正在测试的容器,因为它在特定时间有文件的副本。 如果代码不是你的,而你只是为了构建而克隆它,你可以确保在镜像中安装了git
(将RUN apt-get install -y git
添加到你的Dockerfile如果 ubuntu 映像还没有它),只需使用 git clone
命令将 RUN
添加到您的 Dockerfile 中。 Dockerfile 在许多方面与 Makefile 非常相似,如果适合您的用例,您可以在本地执行的任何操作都可以在构建时完成。【参考方案2】:
您可以通过提供-v
选项来运行容器$ docker run -v <path on host> : <path inside container> <image name>
这会将容器内的路径挂载到主机上的路径。
关于要克隆的应用程序文件,探索dockerfile 是一个不错的选择。 ADD
选项将解决您的问题。
【讨论】:
人们通常只是映射到克隆到主机的代码,例如使用 Git,还是将文件克隆到容器的文件系统?只是想知道良好的做法或人们通常在那里做什么,或者尝试将其克隆到容器中是否有意义 谢谢你,如果我还不想创建我的 docker 文件,我也可以玩这个。只需让容器先与挂载的路径对话,即可让应用程序正常工作。然后继续创建一个 dockerfile 并做对。 除非您正在积极开发代码并使用容器对其进行测试(例如让 apache 在容器中运行并修改本地文件系统上的一些 Web 代码),否则它是卷的反模式-将代码挂载到容器中。【参考方案3】:您可以在构建过程中从容器中安装应用程序或复制它(使用 COPY 而不是 ADD,除非您有充分的理由 https://labs.ctl.io/dockerfile-add-vs-copy/)。它们都是有效的方法。
答案取决于您试图从该容器中实现什么。正在创建一个新容器,这是您偶尔或经常会做的事情。您会在某个时间点与其他人分享这张图片吗? Dockerfile 非常适合可重复的任务。每次构建时,它都会以相同的一致步骤创建一个图像。作为学习的一部分,我建议学习编写 Dockerfile。
您当然可以在容器内手动设置一次,然后提交并推送它。这样你(或其他人)可以稍后再拉它并从那一点继续。见https://docs.docker.com/engine/reference/commandline/commit/
【讨论】:
以上是关于存放应用程序文件的位置 - Docker的主要内容,如果未能解决你的问题,请参考以下文章