Docker:通过卷将dockerfile创建的文件与主机同步

Docker:通过卷将dockerfile创建的文件与主机同步,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,当我使用docker compose with volumes将文件从主机同步到容器时,我看不到docker文件中创建的任何新文件 my docker-compose.yml: version: "3" services: web: image: nginx:latest volumes: - ./:/code links: - php php: build: . volumes: - ./:/cod

当我使用docker compose with volumes将文件从主机同步到容器时,我看不到docker文件中创建的任何新文件

my docker-compose.yml:

version: "3"

services:
  web:
    image: nginx:latest
    volumes:
        - ./:/code
    links:
        - php

  php:
    build: .
    volumes:
      - ./:/code
我的dockerfile如下所示:

FROM php:7-fpm

WORKDIR /code

RUN touch testfile
当然,这是一个简化的示例,但是为什么我在主机系统上看不到“testfile”?如果我使用
docker compose exec php touch testfile
一切正常,我会在主机上看到测试文件。
据我所知,我确实需要在容器外部看到它,以便与具有相同卷的其他容器(在本例中为nginx)共享它。

当您在
Dockerfile
中运行
触摸测试文件时,它会在映像本身内创建
测试文件

现在,当您启动容器并将
/
目录装载到
/code
时,它将装载到图像中现有的
/code
文件夹上,这就是您看到它为空的原因。如果您没有在compose文件中添加卷装载,则其中会有
testfile


注意:我不完全理解您的用例,但如果您希望映像在卷装载中创建该文件,则需要将其添加到入口点

如果你否决我的问题,请向我解释我做错了什么。没有解释的否决票对我以后的问题没有帮助我没有否决票,但很可能是那个人认为你没有对Docker的工作方式做足够的研究。但这是一个提问和学习的地方。非常感谢你的回答。我的用例是,我有一个示例配置文件(example.config.php),并希望将其重命名为config.php。现在我仍然希望我的目录挂载在容器中,因为我想为开发目的设置它,所以很遗憾,复制。然后是一个运行mv的示例。。。配置。。这是不可能的。所以,我尝试在dockerfile中的entrypoint或CMD中这样做,但之后让容器退出。我理解它为什么会退出,因为容器完成了它的工作,但是附加一个
&&tail-f/dev/null
也不起作用,正如许多其他相关问题所建议的那样。在尝试了几个小时后,我得到了第三个服务,它只测试文件是否存在,如果不存在,则复制它。就像执行bash脚本作为入口点的“init服务”。听起来对我来说不是一个理想的解决方案,但是,你有更好的吗?