在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.html
和images/
。
但是,你把它们放在容器里
在运行时,您从您创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
外部。 然后,当容器启动并且添加目录装载时,它们将在那里。