使用 Docker Compose 将文件复制到容器
Copying files to a container with 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-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
文件将现有文件复制到容器中。
给出
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 (缩写)
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
我有一个 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-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
文件将现有文件复制到容器中。
给出
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 (缩写)
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