我打算从Docker Hub安装一个mongodb docker容器,然后将一些数据插入其中。显然,需要一个mongodb种子容器。所以我做了以下事情:
在Dockerfile
中创建了一个mongo_seed/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的数据
在当前工作目录中创建了一个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中使用?
答案 0 :(得分:1)
您可以尝试在脚本文件中将行尾更改为UNIX。
答案 1 :(得分:0)
注意错误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"]