在Docker-合成生成或Docker-合成上创建文件/文件夹

0mkxixxg  于 2023-03-17  发布在  Docker
关注(0)|答案(1)|浏览(165)

我正在尝试进入Docker的第一步,所以我尝试创建一个Docker文件,它创建一个简单的index.html和一个目录图像(见下面的代码)
然后我运行docker-compose build来创建图像,运行docker-compose-up来运行服务器,但是我没有得到index.html文件或文件夹图像。
这是我的Dockerfile:

FROM php:apache
MAINTAINER me@example.com

WORKDIR /var/www/html

RUN touch index.html \
    && mkdir images

这是我的docker-compose.yml

version: '2'
services:
  web:
    build: .docker/web
    ports:
      - "80:80"
    volumes:
      - ./docroot:/var/www/html

我希望这会创建一个包含图像目录和index.html的docroot文件夹,但我只得到了docroot。

eeq64g8w

eeq64g8w1#

映像确实包含这些文件

Dockerfile包含有关如何构建映像的说明。从该Dockerfile构建的映像 * 不 * 包含index.htmlimages/

但是,您在容器中覆盖了它们

在运行时,您从构建的映像创建了一个容器。在该容器中,您将外部目录./docroot装载为/var/www/html
挂载将隐藏该路径上以前的内容,因此此挂载将隐藏/var/www/html以前的内容,用./docroot中的内容替换它们。

把东西放进坐骑

在你要求的评论中
有没有可能先挂载,然后创建文件什么的?还是不可能?
按照您的操作方式,您装载了原始文件,因此一旦创建了容器,就无法再访问这些文件。
有几种方法可以解决这个问题。

更改其在图像中的路径

如果您将这些文件放在映像中的其他路径中,则它们不会被装载覆盖。

WORKDIR /var/www/alternate-html

RUN touch index.html \
    && mkdir images

WORKDIR /var/www/html

现在,在运行时,您仍然可以在/var/www/html上挂载,它将包含来自外部目录的内容,该目录可能是空目录,也可能不是空目录。如果需要,您可以在启动时告诉容器运行脚本并将内容复制到那里。

COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

(This假设您没有定义的入口点-如果您有,您可能只需要调整现有的脚本。)
entrypoint.sh:

#!/bin/sh

cp -r /var/www/alternate-html/* /var/www/html
exec "$@"

这将运行cp命令,然后将控制权交给该映像的CMD

外部处理

您还可以选择从外部将所需的文件预先填充到./docroot中,这样,当容器启动并添加目录挂载时,这些文件就在那里了。

相关问题