Mongodb 如何在Windows中为docker容器种子

Mongodb 如何在Windows中为docker容器种子,mongodb,docker,docker-compose,dockerfile,docker-for-windows,Mongodb,Docker,Docker Compose,Dockerfile,Docker For Windows,我打算从安装mongodb docker容器,然后向其中插入一些数据。显然,需要一个mongodb种子容器。因此,我做了以下工作: FROM mongo:latest WORKDIR /tmp COPY data/shops.json . COPY import.sh . CMD ["/bin/bash", "-c", "source import.sh"] #!/bin/bash ls . mongoimport --host mongodb --db data --collection s

我打算从安装mongodb docker容器,然后向其中插入一些数据。显然,需要一个mongodb种子容器。因此,我做了以下工作:

FROM mongo:latest
WORKDIR /tmp
COPY data/shops.json .
COPY import.sh .
CMD ["/bin/bash", "-c", "source import.sh"]
#!/bin/bash
ls .
mongoimport --host mongodb --db data --collection shops --file shops.json
version: '3.4'
services:
  mongodb:
    image: mongo:latest
    ports: 
    - "27017:27017"
    container_name: mongodb 
  mongodb_seed:
    build: mongodb_seed
    links:
    - mongodb
  • Mongo_seed/Dockerfile
    中创建了Mongo seed容器的
    Dockerfile
    ,并且
    Dockerfile
    中的代码如下:

    FROM mongo:latest
    WORKDIR /tmp
    COPY data/shops.json .
    COPY import.sh .
    CMD ["/bin/bash", "-c", "source import.sh"]
    
    #!/bin/bash
    ls .
    mongoimport --host mongodb --db data --collection shops --file shops.json
    
    version: '3.4'
    services:
      mongodb:
        image: mongo:latest
        ports: 
        - "27017:27017"
        container_name: mongodb 
      mongodb_seed:
        build: mongodb_seed
        links:
        - mongodb
    
    import.sh
    的代码如下:

    FROM mongo:latest
    WORKDIR /tmp
    COPY data/shops.json .
    COPY import.sh .
    CMD ["/bin/bash", "-c", "source import.sh"]
    
    #!/bin/bash
    ls .
    mongoimport --host mongodb --db data --collection shops --file shops.json
    
    version: '3.4'
    services:
      mongodb:
        image: mongo:latest
        ports: 
        - "27017:27017"
        container_name: mongodb 
      mongodb_seed:
        build: mongodb_seed
        links:
        - mongodb
    
    shops.json
    文件包含要导入Mongo的数据

  • 在当前工作目录中创建了一个
    docker compose.yml
    文件,代码如下:

    FROM mongo:latest
    WORKDIR /tmp
    COPY data/shops.json .
    COPY import.sh .
    CMD ["/bin/bash", "-c", "source import.sh"]
    
    #!/bin/bash
    ls .
    mongoimport --host mongodb --db data --collection shops --file shops.json
    
    version: '3.4'
    services:
      mongodb:
        image: mongo:latest
        ports: 
        - "27017:27017"
        container_name: mongodb 
      mongodb_seed:
        build: mongodb_seed
        links:
        - mongodb
    
  • 上面的代码成功地使
    mongodb
    服务执行
    import.sh
    以导入json数据-
    shops.json
    它在我的Ubuntu中运行得非常好。但是,当我试图在Windows中运行命令
    docker compose up-d--build mongodb_seed
    时,数据导入失败,出现错误日志:

    Attaching to linux_mongodb_seed_1
    mongodb_seed_1  | ls: cannot access '.'$'\r': No such file or directory
    : no such file or directory2T08:33:45.552+0000  Failed: open shops.json
    mongodb_seed_1  | 2019-04-02T08:33:45.552+0000  imported 0 documents
    

    有人知道为什么会这样吗?以及如何修复它,使其也能在Windows中工作?

    您可以尝试在脚本文件中将行结尾更改为UNIX。

    请注意错误
    ls:cannot access'.$'\r':没有这样的文件或目录

    Windows上Docker(或任何基于Linux/macOS的系统)的一个问题是处理行尾的方式不同

    Windows在回车和换行符中结束换行符
    \r\n
    ,而Linux和macOS仅使用换行符
    \n
    。当您尝试在Windows中创建文件并在Linux/macOS系统上运行它时,这会成为一个问题,因为这些系统将
    \r
    视为一段文本而不是换行符

    每当有人在Windows上的任何编辑器上编辑任何内容时,请确保在脚本文件上运行
    dos2unix
    。即使脚本文件是在Git Bash上创建的,也不要忘记运行
    dos2unix

    dos2unix import.sh
    

    就你而言:

    FROM mongo:latest
    RUN apt-get update && apt-get install -y dos2unix
    WORKDIR /tmp
    COPY data/shops.json .
    COPY import.sh .
    RUN dos2unix /import.sh && apt-get --purge remove -y dos2unix
    CMD ["/bin/bash", "-c", "source import.sh"]
    

    您是否在Windows上运行Linux容器?是否可以删除install.sh并将所有内容放入CMD中?您也可以在docker compose(命令:…)中重写CMD,我想可以,但我不知道Mongo seed的
    Dockerfile
    中的
    WORKDIR
    COPY
    命令是如何工作的。我从链接下载了mongo docker图像,并检查了该mongo docker图像是否确实是Linux。问题可能是import.sh现在具有Windows样式的线条结尾。