【问题标题】:How to seed a docker container in Windows如何在 Windows 中播种 docker 容器
【发布时间】:2019-04-02 08:38:42
【问题描述】:

我打算从Docker Hub 安装一个 mongodb docker 容器,然后在其中插入一些数据。显然,需要一个 mongodb 种子容器。所以我做了以下事情:

  1. mongo_seed/Dockerfile 中创建了一个 Dockerfile 的 Mongo 种子容器,Dockerfile 中的代码如下:

    FROM mongo:latest
    WORKDIR /tmp
    COPY data/shops.json .
    COPY import.sh .
    CMD ["/bin/bash", "-c", "source import.sh"]
    

    import.sh的代码如下:

    #!/bin/bash
    ls .
    mongoimport --host mongodb --db data --collection shops --file shops.json
    

    shops.json 文件包含要导入 Mongo 的数据

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

    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 中运行?

【问题讨论】:

  • 您是否在 Windows 上运行 Linux 容器?
  • 是否有可能摆脱 install.sh 并把所有的 CMD?您还可以在 docker-compose 中覆盖 CMD(命令:...)
  • 我想是的,但我不知道 Mongo 种子的Dockerfile 中的WORKDIRCOPY 命令是如何工作的。我从链接Docker Hub下载了mongo docker镜像,并检查了这个mongo docker镜像确实是Linux
  • 问题可能是 import.sh 现在有 Windows 样式的行尾。

标签: mongodb docker docker-compose dockerfile docker-for-windows


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    注意错误ls: cannot access '.'$'\r': No such file or directory

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

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

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

    dos2unix import.sh
    

    https://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/

    在你的情况下:

    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"]
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 2018-01-04
      • 2017-02-25
      相关资源
      最近更新 更多