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

新手上路,请多包涵

我有一个 Dockerfile 我将现有目录(包含内容)复制到工作正常的容器中:

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

使用 docker exec 列出目录的屏幕截图

但是当我使用 docker-compose.yml 文件时,只有目录 aw3somevideo 而里面 aw3somevideo 什么都没有。

码头工人-compose.yml

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

空目录列表截图

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

原文由 TheDoctor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

给定

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

如果 /dir/on/host 不存在,则在主机上创建它,并将空内容安装在 /var/www/html 的容器中。您之前在 /var/www/html 中拥有的任何内容都无法访问,直到您卸载卷;新坐骑隐藏了旧内容。

原文由 Bernard 发布,翻译遵循 CC BY-SA 4.0 许可协议

前言: 我意识到这个问题已经很老了,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 (缩写)

 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 inspect , Mount 部分的输出 (缩写)

 "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

原文由 tleding 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题