存放应用程序文件的位置 - 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的主要内容,如果未能解决你的问题,请参考以下文章

docker配置文件路径

Docker配置本地镜像与容器的存储位置

四个修改Docker默认存储位置的方法

docker 修改默认存储位置

Docker镜像管理

Docker数据卷之进阶篇