在docker-compose build或docker-compose上创建文件/文件夹

时间:2017-02-22 19:13:03

标签: docker docker-compose dockerfile

我正在尝试进入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。

1 个答案:

答案 0 :(得分:18)

图像确实包含这些文件

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

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

entrypoint.sh:

#!/bin/sh

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

这将运行cp命令,然后将控制权移交给此图像的CMD

从外部处理

您还可以选择在外部将所需文件预先填充到./docroot。然后,当容器启动时,它们将在那里并添加目录mount。