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


评论

以下bash脚本填充jekyll数据命名卷的位置为什么要使用bash脚本创建docker卷?

与devops.stackexchange.com/q/3275/5879有关,基本上会生成静态站点,然后通过命名卷将其安装在Nguni容器中

为什么不复制呢?

由于文件夹结构的缘故,这是不可能的。 Jekyll和Nginx是同级文件夹,每个文件夹都有自己的容器。 COPY不允许访问其自身文件夹之外的文件。

使用docker compose / swarm将每个容器放在自己的文件夹中通常是一个好主意吗?

#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