如何修改Docker映像?

n3ipq98p  于 2023-08-03  发布在  Docker
关注(0)|答案(4)|浏览(130)

我已经下载了一个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"]

字符串

**注意:**我正在寻找一个简单和干净的方法来改变现有的形象,而不是创建一个新的形象的变化。

stszievb

stszievb1#

由于现有的Docker镜像无法更改,我所做的就是基于我原来的Docker镜像为新的Docker镜像创建一个dockerfile,并修改它以将本地的测试文件夹包含到新镜像中。
这个链接很有用:
构建自己的镜像- Docker文档

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命令编辑和保存文件。

ou6hu8tu

ou6hu8tu2#

您不会更改现有图像,图像将标记有校验和,并被视为只读。使用镜像的容器指向文件系统上的相同文件,为容器添加了它们的RW层,因此依赖于未更改的镜像。层缓存也增加了这种依赖性。
由于分层的文件系统和缓存,仅添加一个文件夹创建新映像只会添加一个层,而不是新映像的完整副本。因此,简单/干净/正确的方法是使用Dockerfile创建新映像。

l7wslrjt

l7wslrjt3#

首先,我不建议你乱用其他图像。如果你能创造自己的就更好了。接下来,您可以使用copy命令将文件夹从主机添加到Docker镜像。

COPY <src> <dest>

字符串
唯一需要注意的是<src>路径必须在构建的上下文中;你不能复制../something /something,因为docker构建的第一步是将context目录(和子目录)发送到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"]

4uqofj5v

4uqofj5v4#

我认为你可以使用docker cp命令对从你的docker镜像运行的容器进行更改,然后提交更改。
这里有一个参考,
docker cp指南:https://docs.docker.com/engine/reference/commandline/cp/
docker commit指南:https://docs.docker.com/engine/reference/commandline/container_commit/
请记住,Docker镜像是只读的,因此您无法对其进行任何更改。唯一的方法是修改你的docker文件并重新创建镜像,但在这种情况下,你会丢失数据(如果没有挂载在Docker卷上)。但是你可以对非只读的容器进行修改。

相关问题