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

Bre*_*ntg 15 docker dockerfile docker-compose

我正在尝试我的第一步到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
Run Code Online (Sandbox Code Playgroud)

这是我的docker-compose.yml

version: '2'
services:
  web:
    build: .docker/web
    ports:
      - "80:80"
    volumes:
      - ./docroot:/var/www/html
Run Code Online (Sandbox Code Playgroud)

我希望这会创建一个带有图像目录和index.html的docroot文件夹,但我只获得了docroot.

Dan*_*owe 21

图像确实包含这些文件

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
Run Code Online (Sandbox Code Playgroud)

现在,在运行时,您仍将使用此挂载/var/www/html,它将包含外部目录中的内容.哪个可能是也可能不是空目录.您可以在启动时告诉容器运行脚本并将其复制到那里,如果这是您想要的.

COPY entrypoint.sh /entrypoint.sh
RUN chmod 0755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

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

entrypoint.sh:

#!/bin/sh

cp -r /var/www/alternate-html/* /var/www/html
exec "$@"
Run Code Online (Sandbox Code Playgroud)

这将运行cp命令,然后将控制权交给CMD此图像的任何内容.

在外部处理它

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

  • 我仍在寻找如何让 docker-compose 在主机上为绑定卷创建文件夹的答案。 (2认同)