在docker-compose build或docker上创build文件/文件夹 – 组成

我试图进入Docker的第一步,所以我试着做一个Dockerfile,创build一个简单的index.html和一个目录图像(见下面的代码)

然后我运行docker-compose build来创build镜像,然后运行docker-compose-up来运行服务器。 但是我没有得到文件index.html或文件夹图像。

这是我的Dockerfile:

FROM php:apache MAINTAINER brent@dropsolid.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 

我期望这将创build一个图像目录和一个index.html的docroot文件夹,但我只得到docroot。

该图像包含这些文件

Dockerfile包含有关如何构build图像的说明。 您从Dockerfile构build的映像确实包含index.htmlimages/

但是,你把它们放在容器里

在运行时,您从您创build的映像创build了一个容器。 在该容器中,您将外部目录./docroot/var/www/html

挂载程序会隐藏以前的path,所以这个挂载程序将隐藏/var/www/html的前面的内容,用./docroot任何内容replace它们。

把东西放在你的座位上

在你问的意见中

那么有没有可能先安装,然后创build文件或东西? 或者是不可能的?

你做事情的方式,你已经装载了原始文件,所以一旦容器被创build,它们就不能再被访问了。

有几种方法可以处理这个问题。

改变它们在图像中的path

如果将这些文件放在图像中的不同path中,则不会被挂载覆盖。

 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"] 

(这是假设你没有定义的入口点 – 如果你这样做,你可能只需要调整你现有的脚本)。

entrypoint.sh:

 #!/bin/sh cp -r /var/www/alternate-html/* /var/www/html exec "$@" 

这将运行cp命令,然后手动控制该图像的CMD

处理它外部

您也可以select将所需的文件预先填入./docroot外部。 然后,当容器启动并且添加目录装载时,它们将在那里。