如何在 Windows 中播种 docker 容器
How to seed a docker container in Windows
我打算从 Docker Hub 安装一个 mongodb docker 容器,然后向其中插入一些数据。显然,需要一个 mongodb 种子容器。所以我做了以下事情:
在 mongo_seed/Dockerfile
中创建了一个 Dockerfile
of 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 中工作?
您可以尝试在脚本文件中将行尾更改为 UNIX。
注意错误 ls: cannot access '.'$'\r': No such file or directory
。
Docker(或任何基于 Linux/macOS 的系统)在 Windows 上的一个问题是行尾的处理方式不同。
Windows 在回车 return 和换行符 \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"]
我打算从 Docker Hub 安装一个 mongodb docker 容器,然后向其中插入一些数据。显然,需要一个 mongodb 种子容器。所以我做了以下事情:
在
mongo_seed/Dockerfile
中创建了一个Dockerfile
of 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 中工作?
您可以尝试在脚本文件中将行尾更改为 UNIX。
注意错误 ls: cannot access '.'$'\r': No such file or directory
。
Docker(或任何基于 Linux/macOS 的系统)在 Windows 上的一个问题是行尾的处理方式不同。
Windows 在回车 return 和换行符 \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"]