Как заполнить контейнер докера в Windows - PullRequest
1 голос
/ 02 апреля 2019

Я намеревался установить докер-контейнер mongodb из Docker Hub , а затем вставить в него некоторые данные.Очевидно, нужен контейнер для семян mongodb.Поэтому я сделал следующее:

  1. создал Dockerfile контейнер семян Монго в mongo_seed/Dockerfile, а код в 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.Однако, когда я попытался запустить команду docker-compose up -d --build mongodb_seed в Windows, импорт данных не удался с журналами ошибок:

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?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете попытаться изменить конец строки на UNIX в вашем файле скрипта.

0 голосов
/ 02 апреля 2019

Обратите внимание на ошибку ls: cannot access '.'$'\r': No such file or directory.

Одной из проблем Docker (или любой системы на основе Linux / macOS) в Windows является различие в обработке концов строк.

Windowsзаканчивает строки в возврате каретки и переводе строки \r\n, в то время как Linux и macOS используют только перевод строки \n.Это становится проблемой, когда вы пытаетесь создать файл в Windows и запустить его в системе Linux / macOS, потому что эти системы обрабатывают \r как фрагмент текста, а не как новую строку.

Убедитесь, чтозапускайте dos2unix в файле сценария всякий раз, когда кто-либо что-либо редактирует в любом редакторе Windows.Даже если файл сценария создается в 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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...