【问题标题】:create an app in a docker container (confused about tasks order)在 docker 容器中创建应用程序(对任务顺序感到困惑)
【发布时间】:2021-02-26 20:49:12
【问题描述】:

我必须构建一个简单的应用程序来读取文本文件并处理其内容(例如删除多个空格、处理单词等),但我对作业的第一部分感到困惑。

“在 docker 容器中初始化一个 git 存储库,然后实现一个应用程序....”

我使用 Debian,我安装了 docker 和 git,并研究了它。根据我阅读的内容,我必须创建一个包含一些指令的 Dockerfile,然后我构建映像,然后运行容器,运行?

但我还是很困惑,这些东西的顺序是什么?我可以先在 Intelij 中编写应用程序,然后再创建 Dockerfiler 吗?或者我必须先创建容器然后对应用程序进行编码?但是我如何构建容器?我读了很多关于这方面的内容,你能给我一些建议吗?我提到,在每个应用程序“任务”(读取文本文件、处理文本等)之后,我必须执行 git add、git commit 和 git push(如果它有助于回答)

【问题讨论】:

    标签: linux git docker debian


    【解决方案1】:

    如果指令说“在 docker 容器中初始化 Git 存储库”,那么您应该:

    1. 运行例如一个 Debian 容器
    2. 如果 Git 不存在,请安装它
    3. 初始化回购
    4. 编写您的应用程序
    5. 提交作业

    你可以:

    docker run \
    --interactive --tty --rm \
    --name=homework \
    --volume=${PWD}/homework:/homework \
    --workdir=/homework \
    debian:buster-slim
    

    这会将 Debian “buster” 映像作为容器运行,并且应该 (!) 在容器中为您提供 shell 提示。

    容器中的/homework 目录将映射到您主机的${PWD}/homework,并且当容器启动时您将位于/homework 目录中。这意味着如果您退出容器,您的工作不会丢失。

    从容器的提示符中:

    # pwd
    /homework
    
    # git
    bash: git: command not found
    
    # apt update && apt install -y git
    ...
    done.
    
    # git
    usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
               [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
               [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
               [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
               <command> [<args>]
    
    # git init
    Initialized empty Git repository in /homework/.git/
    

    注意事项

    • 如果退出容器,可以重新运行docker run ...命令返回。
    • 当您存在容器时,您可以ls -la ${PWD}/homework 看到.git 目录(至少)保留在您的主机上。
    • 确保从它创建${PWD}/homework 的同一目录运行它。或修改--volume=...

    【讨论】:

      【解决方案2】:

      我会推荐一个整体的工作流程

      1. 在没有 Docker 的情况下构建应用程序;那么
      2. 将其打包到 Docker 映像中(如果有意义的话)。

      您应该能够完全正常地构建应用程序。无论您使用哪种语言来构建应用程序,请确保使用其正常的打包工具。例如,您的package.json/Gemfile/requirements.txt/go.mod 应该列出您的应用程序需要运行的所有库依赖项。在本地运行它,为它编写适当的单元测试,然后构建一些可以正常工作的东西。

      一旦成功,然后将其推送到 Docker 中。您需要编写一个构建映像的 Dockerfile。一个通用的配方是

      FROM language-base-image     # python:3.9, node:14, ...
      WORKDIR /app
      COPY dependencies-file .     # requirements.txt, package.json, ...
      RUN install the dependencies # pip install, npm install, ...
      COPY . .
      RUN build the application    # npm run build, ...
      CMD ./the_application        # npm run start, ...
      

      然后您应该能够docker build 一个图像,并docker run 一个容器从生成的图像。 Docker 文档包括贯穿此序列的sample application

      请特别注意,“读取文本文件”的问题任务在 Docker 中比没有时要困难得多。您需要使用bind mount 将主机文件系统的访问权限授予容器,然后引用容器端路径。例如,

      docker run --rm -v $PWD/data:/data my-image \
        ./the_application --input /data/file.txt
      

      我不会费心尝试使用 Docker 作为我的主要开发环境,尤其是对于一个介绍性项目。 Docker 被设计为一个隔离系统,并且故意处理来自容器的主机文件很棘手,反之亦然。尤其是如果您可以使用可以通过apt-getbrew 轻松安装的相当常规的编程语言,并且您没有棘手的主机库依赖关系,那么在普通主机构建中完成大部分开发工作要容易得多环境只在后期使用 Docker。

      【讨论】:

        猜你喜欢
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多