docker-compose.yml
中定义命名卷时,其名称之前带有其父文件夹名称。当泊坞窗外的脚本必须与它们进行交互时,这会导致问题。问题是,解决此问题的最佳方法是什么?示例场景将包括以下
docker-compose.yml
:version: "3"
services:
nginx:
build: ./nginx
container_name: nginx
ports:
- "80:80"
volumes:
- jekyll-data:/usr/share/nginx/html:ro
networks:
backend:
volumes:
jekyll-data:
jekyll-data
命名卷由以下bash脚本填充:docker run \
--name helper \
--volume="parent_folder_jekyll-data:/web" \
-it busybox \
true
docker cp jekyll/web/. helper:/web
docker rm helper
在上述情况下,
parent_folder
是父文件夹的名称。这意味着将内容移动到其他文件夹将破坏应用程序。有没有适当的方法来应对这种情况?docker volume ls
的删节输出已删除了未命名的卷:DRIVER VOLUME NAME
local flaskthymedata_grafana-data
local flaskthymedata_influxdb-data
local flaskthymedata_postgres-data
local veleda_grafana-data
local veleda_influxdb-data
local veleda_jekyll-cache
local veleda_jekyll-data
local veleda_postgres-data
local veledaio_grafana-data
local veledaio_influxdb-data
local veledaio_jekyll-cache
local veledaio_jekyll-data
local veledaio_postgres-data
#1 楼
Docker在当前文件夹名称前添加使用docker compose文件创建的所有组件名称。例如:如果包含docker-compose.yml文件的当前文件夹名称为test,则所有卷,网络和容器名称将被附加到测试中。为了解决该问题,人们早先提出了在docker-compose命令中使用-p标志的想法,但是该解决方案并不是最可行的解决方案,因为仅在-p属性之后需要一个项目名称。然后将项目名称附加到使用docker compose文件创建的所有组件中。
解决上述问题的方法是使用name属性,如下所示。 />
该卷在服务部分中可以称为
volumes:
data:
driver: local
name: mongodata
networks:
internal-network:
driver: bridge
name: frontend-network
上述名称属性将阻止docker-compose放置文件夹名称。
注意:对于容器名称,可以使用属性container_name
services:
mongo-database:
volumes:
- data:/data/db
networks:
- internal-network
评论
这是一个有用的解决方案,因为docker-compose使用的命名方案已更改。它们曾经用于删除父文件夹名称中的连字符,但现在将它们包括在内。您的解决方案消除了这种歧义。
–莫里茨
19年11月27日在10:25
是的,莫里茨,您的陈述绝对正确。使用Docker提供的文件夹名称的命名约定在Production中也不可行。它们提供的理由(即,您可以基于用户名为不同的环境(开发人员和生产人员)运行多个容器)对我也没有吸引力。也许您可以将其标记为已接受的答案,因为上述答案在某种程度上无法避免所保存的问题。尽管它在信息方面非常有用。
–Shubhanshu Rastogi
19/12/27在5:41
#2 楼
自己创建docker卷而不是让docker为您呢? https://docs.docker.com/engine/reference/commandline/volume_create/如果您自己创建docker卷,则父文件夹将不会自动连接。
评论
我删除了所有卷,创建了没有文件夹名称前缀的卷,然后再次运行docker compose。它使用文件夹名称前缀重新创建了卷。
–莫里茨
18-2-14在21:19
不好的是,在重置环境时,我使用了docker system prune -a,但是之后我不得不运行docker volume prune。解决我的问题的好方法
–莫里茨
18年2月14日在23:25
评论
以下bash脚本填充jekyll数据命名卷的位置为什么要使用bash脚本创建docker卷?与devops.stackexchange.com/q/3275/5879有关,基本上会生成静态站点,然后通过命名卷将其安装在Nguni容器中
为什么不复制呢?
由于文件夹结构的缘故,这是不可能的。 Jekyll和Nginx是同级文件夹,每个文件夹都有自己的容器。 COPY不允许访问其自身文件夹之外的文件。
使用docker compose / swarm将每个容器放在自己的文件夹中通常是一个好主意吗?