gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:43:09 27 4
gpt4 key购买 nike

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

最佳答案

图像确实包含这些文件

Dockerfile 包含有关如何构建镜像的说明。您从该 Dockerfile 构建的镜像确实包含 index.htmlimages/

但是,您在容器中过度使用它们

在运行时,您从构建的镜像创建了一个容器。在该容器中,您将外部目录 ./docroot 挂载为 /var/www/html.

挂载会隐藏该路径之前的所有内容,因此此挂载将隐藏 /var/www/html 的先前内容,并将其替换为 ./docroot

把东西放进你的坐骑

在你问的评论中

is there a possibility then to first mount and then create files or something? Or is that impossible?

你做事的方式,你挂载在你的原始文件上,所以一旦容器被创建,它们就不能再访问了。

有几种方法可以解决这个问题。

改变他们在图片中的路径

如果您将这些文件放在镜像中的不同路径中,则它们不会被挂载覆盖。

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

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

入口点.sh:

#!/bin/sh

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

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

在外部处理

您还可以选择简单地将您想要的文件预先填充到外部 ./docroot 中。然后它们将在容器启动并添加目录挂载时出现。

关于docker - 在 docker-compose build 或 docker-compose up 上创建文件/文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42400290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com