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

我有一个 Dockerfile,其中我复制了一个现有的目录(内容)到容器,工作良好:

文件夹

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

Screenshot of directory listing with 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

Screenshot of empty directory listing

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

336764 次浏览

给予

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

如果不存在 /dir/on/host,则在主机上创建它,并将空内容挂载到位于 /var/www/html的容器中。在卸载卷之前,无论您以前在容器内的 /var/www/html中有什么内容,都是不可访问的; 新的挂载将隐藏旧的内容。

在 Dockerfile 上将 COPY 更改为 ADD。这是复制目录而不是文件的方法

前言: 我意识到这个问题已经很老了,OP 可能已经找到了一个解决办法,但是因为我没有看到一个准确的答案,所以我觉得应该解决 OP 提出的问题以及任何相关的问题。

首先,澄清 名为“卷”绑定架之间的区别。前者允许您从容器外部看到容器位置中已经存在的文件,而后者不允许。实际上,绑定挂载的操作非常类似于在 xNIX 中挂载卷时的操作,这意味着在挂载设备之后,已经在挂载位置中的任何文件都将被屏蔽——可以将其视为一个覆盖。

接下来,当您指定 ./Frontend/ :/var/www/html/时,您将指定一个绑定挂载,这就是为什么当您在主机端查看 ./Frontend时,您期望看到的所有文件都消失了。如果我正确地理解了您的最终目标,那么您希望通过容器外的完全相同的位置来访问容器内 /var/www/html/中的文件。如果是这样,那么您可能希望使用命名卷和用户指定的挂载点,如下所示:

volumes:
Frontend:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/var/www/html'


php:
build: php/
volumes:
- Frontend:/var/www/html/

请注意,如果没有上面列出的 driver_opts,命名卷将仍然存在,但主机端位置将位于 Docker 区域。这通常是类似于 /var/lib/docker/volumes或类似的东西。确切的位置可以在 docker inspect命令的 Mounts部分中找到。


例子

在我的 PiHole 实验室主机上有一个类似的设置。

Docker-compose. yml < em > (缩写)

volumes:
etc-pihole:
etc-dnsmasq.d:
etc-unbound:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/home/dockeruser/ct5/etc-unbound'


services:
pihole:
container_name: asbuilt_ct5
hostname: pb-asbuilt-5
volumes:
- './etc-pihole:/etc/pihole/'
- './etc-dnsmasq.d:/etc/dnsmasq.d/'
- 'etc-unbound:/etc/unbound/'

输出 sudo docker inspectMount节只 < em > (缩写)

"Mounts": [
{
"Type": "bind",
"Source": "/home/dockeruser/ct5/etc-dnsmasq.d",
"Destination": "/etc/dnsmasq.d",
},
{
"Type": "bind",
"Source": "/home/dockeruser/ct5/etc-pihole",
"Destination": "/etc/pihole",
},
{
"Type": "volume",
"Name": "ct5_etc-unbound",
"Source": "/var/lib/docker/volumes/ct5_etc-unbound/_data",
"Destination": "/etc/unbound",
"Driver": "local",
}
]

容器文件列表: /etc/unbound

root@pb-asbuilt-5:/# ls /etc/unbound
unbound.conf  unbound.conf.d  unbound_control.key  unbound_control.pem  unbound_server.key  unbound_server.pem

主机端文件列表: /home/dockeruser/ct5/etc-unbound

[dockertest-srv1] > ls /home/dockeruser/ct5/etc-unbound
unbound.conf  unbound.conf.d  unbound_control.key  unbound_control.pem  unbound_server.key  unbound_server.pem