【问题标题】:Building my own Docker image from officiall Wordpress image从官方 Wordpress 图像构建我自己的 Docker 图像
【发布时间】:2021-10-28 10:53:25
【问题描述】:

我正在尝试基于来自 Docker Hub 的图像构建自己的图像 我想要做的是将一些新文件添加到图像上的现有文件系统中 我创建了具有以下内容的 Dockerfile:

来自 wordpress

复制。 /var/www/html/wp-content/plugins

这里我试图获取官方的 wordpress 图像,然后将我当前目录中的一些文件复制到 plugins 文件夹中。然后我构建了图像并获得了新图像,我们称之为 newimage。然后我尝试基于这个 newimage 运行容器,并且我想使用这个容器的卷来在我的主机上存储数据。我正在执行这个命令:

docker run -d --name wp -v wp-volume:/var/www/html newimage

容器启动良好,但是当我尝试检查文件夹 var/www/html/wp-content/plugins 时,我看不到在构建此映像阶段复制的文件。但是如果我执行命令: docker run -d --name wp newimage 在不使用卷的情况下,我可以看到在路径 /var/www/html/wp-content/plugins 中复制的文件 那么为什么如果我运行带有卷的容器我看不到我的文件但是如果我运行没有卷的容器我可以在 /var/www/html/wp-content/plugins 中看到我的文件

【问题讨论】:

    标签: php wordpress docker volumes


    【解决方案1】:

    当您将卷挂载到容器中的目录时,该目录中的所有内容都将替换为卷内容。

    在您的情况下,您将卷安装在 /var/www/html 上。这意味着该路径下图像中的所有现有内容(即您的插件)都将隐藏且无法访问。

    很遗憾,您无法将现有图像内容与卷的内容“合并”。养成的一个好习惯是始终将卷安装在映像中的空目录上,以免意外隐藏内容。

    【讨论】:

    • 文档说明相反:如果你启动一个创建新卷的容器,如上,并且容器在要挂载的目录中有文件或目录(如上面的/app/),目录的内容被复制到卷中。 docs.docker.com/storage/volumes/… 它对我有用。现在的问题是,如果我使用绑定挂载而不是卷,我会得到一个包含文件的新目录,但在该目录中 未显示在使用 COPY 命令构建映像期间添加的文件,但其他文件呈现
    • 您确定启动时该卷不存在吗?先尝试docker volume rm wp-volume 以确保它没有。
    • 我了解卷和绑定挂载之间的区别我的问题是为什么在我的情况下,我在使用 -v /my- 挂载的目录中显示的映像构建 COPY 中没有我添加的文件host-dir:/var/www/html 但会显示初始图像 wordpress 中的文件。但是,如果我使用 volume -v my-volume:/var/www/html 会显示所有文件(来自 wordpress 图像的初始文件和使用 COPY 命令添加的文件)。我想从 wordpress 图像构建自己的图像并将一个文件夹添加到 /var/www/html/wp-content/plugins 但我不能仅使用卷绑定挂载来运行它
    • 当我运行容器时,我每次都使用唯一的卷名称 -v unique-name:/var/www/html 我不明白为什么它不将所有内容复制到安装目录时我使用 -v host-direcotry:/var/www/html 它仅从文件夹 /var/www/html 复制初始内容并跳过在图像构建期间添加的内容。但是,如果我进入容器 - exec -it container bash,我可以看到我在映像构建期间添加的所有文件和内容。因此,当它将容器文件夹安装到主机文件夹时会发生一些事情,但它适用于卷。
    • 当我用新卷测试它时,它会将图像中的内容复制到卷中。
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    相关资源
    最近更新 更多