我正在尝试进入Docker的第一步,所以我尝试制作一个Dockerfile来创建一个简单的index.html和一个目录图像(参见下面的代码)
然后我运行docker-compose 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
我希望这会创建一个带有图像目录和index.html的docroot文件夹,但我只得到docroot。
答案 0 :(得分:18)
Dockerfile包含有关如何构建映像的说明。您从该Dockerfile 构建的图像包含index.html
和images/
。
在运行时,您从您构建的图像中创建了一个容器。在该容器中,您将外部目录./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"]
(假设您没有定义的入口点 - 如果您这样做,您可能只需要调整现有的脚本。)
entrypoint.sh:
#!/bin/sh
cp -r /var/www/alternate-html/* /var/www/html
exec "$@"
这将运行cp
命令,然后将控制权移交给此图像的CMD
。
您还可以选择在外部将所需文件预先填充到./docroot
。然后,当容器启动时,它们将在那里并添加目录mount。