使用Docker Compose将文件复制到容器


100

我在Dockerfile哪里可以将现有目录(包含内容)复制到可以正常工作的容器中:

Docker文件

FROM php:7.0-apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

docker exec目录列表的屏幕快照

但是当我使用docker-compose.yml文件时,只有目录,aw3somevideo而里面aw3somevideo没有任何东西。

docker-compose.yml

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

空目录列表的屏幕快照

也许我不了解它的功能,volumes如果是这种情况,请告诉我如何通过docker-compose.yml文件将现有文件复制到容器中。


5
volumes:从docker-compose文件中删除您的部分。您的图像已经有数据。volumes:部分仅覆盖数据。同时移至当前的docker-compose格式(版本2)。
伯纳德

@碱性thx确实是问题所在。但是,为什么卷不复制整个目录?
TheDoctor'Aug

我会回答,以便您解决此问题。
伯纳德

Answers:


89

给定

    volumes:
      - /dir/on/host:/var/www/html

如果/dir/on/host不存在,则在主机上创建它,并将空内容装入容器中/var/www/html/var/www/html除非卸下卷,否则无法访问容器中以前包含的所有内容。新的安装隐藏了旧内容。


是否有可能在最新的docker版本var/www/html//dir/on/host即使不再存在的内容也不会复制到其中?第一次处理容器时,是否可以将数据从docker容器内强制复制到主机?
Tarator

1
@Tarator是的,确实不再将右侧复制到主机。我将更新答案。至于在容器启动时进行复制的方法,您可以使用类似this的命令覆盖启动命令docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp"。不要忘了使用exec来调用最终命令,以便为它分配PID1。这将确保myapp接收终止信号(例如Ctrl-C)。
伯纳德

嗨,我也尝试与docker-compose进行相同的操作,但遇到错误,请您看一下... stackoverflow.com/questions/45573831/…–
utkarsh31

嘿,伯纳德,在您的回答中提到“右侧是否指定了诸如myvolume之类的命名卷或主机上的路径”。您不是在那儿说“左手”吗,因为那是一个指定卷或主机路径的位置,然后将其映射到rhs上的容器位置?我确实意识到您正在谈论Docker如何管理左右之间的文件复制,以及如何更改文件。
查理·阿瑞哈特

@charliearehart你是对的。现在,我将解决该错误。
伯纳德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.