【问题标题】:Modifying a docker image修改 docker 镜像
【发布时间】:2017-09-10 22:44:03
【问题描述】:

我最近开始研究 docker。我已经下载了一个 docker 映像,我想以某种方式对其进行更改,以便我可以将包含其内容的文件夹从本地复制到该映像中,或者可以编辑映像中的任何文件。

我想如果我能以某种方式提取图像,进行更改然后创建一个图像。不确定它是否会这样工作。我尝试寻找选项,但找不到有希望的解决方案。

镜像的当前 Dockerfile 有点像这样:

FROM abc/def
MAINTAINER Humpty Dumpty <@hd>


RUN sudo apt-get install -y vim

ADD . /home/humpty-dumpty
WORKDIR /home/humpty-dumpty
RUN cd lib && make

CMD ["bash"]

注意:-我正在寻找一种简单而干净的方法来仅更改现有图像,而不是使用更改创建新图像。

【问题讨论】:

    标签: docker dockerfile docker-image


    【解决方案1】:

    由于无法更改现有的 docker 映像,我所做的是,我根据我的原始 docker 映像为新的 docker 映像创建了一个 dockerfile,并将其修改为在新映像中包含本地的测试文件夹。 这个链接很有帮助Build your own image - Docker Documentation

    FROM abc/def:latest
    

    docker 文件中的上述行告诉 Docker 你的镜像基于哪个镜像。因此,父图像中的内容被复制到新图像中

    最后,为了在本地驱动器上包含测试文件夹,我在我的 docker 文件中添加了以下命令

    COPY test /home/humpty-dumpty/test
    

    并且测试文件夹已添加到该新图像中。

    以下是用于从现有镜像创建新镜像的 dockerfile。

    FROM abc/def:latest
    
    # Extras
    RUN sudo apt-get install -y vim
    
    # copies local folder into the image 
    COPY test /home/humpty-dumpty/test
    

    更新:-要在正在运行的 docker 镜像中编辑文件,我们可以使用通过上述 docker 文件安装的 vim 编辑器打开该文件

    vim <filename>
    

    现在,可以使用 vim 命令来编辑和保存文件了。

    【讨论】:

      【解决方案2】:

      您不会更改现有图像,图像标有校验和并被视为只读。使用镜像的容器指向文件系统上的相同文件,为容器添加它们的 RW 层,因此依赖于未更改的镜像。层缓存也增加了这种依赖。

      由于分层文件系统和缓存,创建仅添加一个文件夹的新图像只会添加具有该添加的图层,而不是新图像的完整副本。因此,简单/干净/正确的方法是使用 Dockerfile 创建一个新镜像。

      【讨论】:

      • Ohkk...所以这些图片无法修改。当我下载 docker 图像时,我没有这些图像指向的结构。所以我唯一的选择是创建一个新图像。这同样适用于文件编辑......对吗??
      • 请记住,图像是由 ID(校验和)引用的。一个标签指向一个 ID,多个标签可以指向同一个 ID,或者一个标签指向 ubuntu:latest 之类的东西可以指向一个图像的 ID,其中包含您想要的任何内容。
      【解决方案3】:

      首先,我不建议与其他图像混淆。如果您可以创建自己的,那就更好了。展望未来,您可以使用copy 命令将文件夹从主机添加到 docker 映像。

       COPY <src> <dest>
      

      唯一需要注意的是&lt;src&gt; 路径必须在构建的上下文中;你不能 COPY ../something /something,因为 docker build 的第一步是将上下文目录(和子目录)发送到 docker 守护进程。

      FROM abc/def
      MAINTAINER Humpty Dumpty <@hd>
      
      
      RUN sudo apt-get install -y vim
      
      // Make sure you already have /home/humpty-dumpty directory
      // if not create one
      RUN mkdir -p /home/humpty-dumpty
      
      
      COPY test /home/humpty-dumpty/ // This will add test directory to home/humpty-dumpty
      WORKDIR /home/humpty-dumpty
      RUN cd lib && make
      
      CMD ["bash"]
      

      【讨论】:

        【解决方案4】:

        我认为您可以使用 docker cp 命令更改从您的 docker 映像构建的 container,然后提交更改。

        这是一个参考,

        docker cp 指南: https://docs.docker.com/engine/reference/commandline/cp/

        docker 提交指南:https://docs.docker.com/engine/reference/commandline/container_commit/

        请记住,docker image 只是一个准备就绪,因此您无法对其进行任何更改。唯一的方法是修改您的 docker 文件并重新创建图像,但在这种情况下您会丢失数据(如果未安装在 docker volume 上)。但是您可以对尚未准备好的container 进行更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-04
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 2022-10-15
          相关资源
          最近更新 更多