我正在尝试进入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。
1条答案
按热度按时间eeq64g8w1#
映像确实包含这些文件
Dockerfile包含有关如何构建映像的说明。从该Dockerfile构建的映像 * 不 * 包含
index.html
和images/
。但是,您在容器中覆盖了它们
在运行时,您从构建的映像创建了一个容器。在该容器中,您将外部目录
./docroot
装载为/var/www/html
。挂载将隐藏该路径上以前的内容,因此此挂载将隐藏
/var/www/html
以前的内容,用./docroot
中的内容替换它们。把东西放进坐骑
在你要求的评论中
有没有可能先挂载,然后创建文件什么的?还是不可能?
按照您的操作方式,您装载了原始文件,因此一旦创建了容器,就无法再访问这些文件。
有几种方法可以解决这个问题。
更改其在图像中的路径
如果您将这些文件放在映像中的其他路径中,则它们不会被装载覆盖。
现在,在运行时,您仍然可以在
/var/www/html
上挂载,它将包含来自外部目录的内容,该目录可能是空目录,也可能不是空目录。如果需要,您可以在启动时告诉容器运行脚本并将内容复制到那里。(This假设您没有定义的入口点-如果您有,您可能只需要调整现有的脚本。)
entrypoint.sh:
这将运行
cp
命令,然后将控制权交给该映像的CMD
。外部处理
您还可以选择从外部将所需的文件预先填充到
./docroot
中,这样,当容器启动并添加目录挂载时,这些文件就在那里了。