Docker exec не может выполнить скрипт внутри контейнера

У меня есть скрипт bash, который выполняет некоторые команды Docker:

#!/usr/bin/env bash

echo "Create and start database"
cd ../../database
cp -R ../../../scripts/db db/
docker build -t a_database:1 .
docker run --rm --name a_db -e POSTGRES_PASSWORD=docker -d -p 5432:5432 a_database:1
docker network connect --ip 172.23.0.5 a_network a_db
sleep 15

echo "Initialize database"
docker exec a_db /root/db/dev/init_db.sh

echo "Cleanup"
rm -rf db

На Mac все работает нормально, проблема возникает, когда я пытаюсь запустить этот скрипт на машине Windows. Когда я запускаю его, я получаю сообщение об ошибке:

OCI runtime exec failed: exec failed: container_linux.go:344: starting container process caused "exec: \"C:/Program Files/Git/root/db/dev/init_db.sh\": stat C:/Program Files/Git/root/db/dev/init_db.sh: no such file or directory": unknown

Каталог и скрипт (/root/db/dev/init_db.sh) существуют внутри контейнера докера. Я не знаю, почему он пытается найти скрипт на хост-машине? Также, когда я выполняю команду:

docker exec a_db /root/db/dev/init_db.sh

непосредственно в командной строке (на окнах) выполняется скрипт. Есть идеи, что не так и почему он пытается использовать git?

3 ответа

Это не ошибка в Docker, а то, как mingw обрабатывает эти пути. Вот еще немного информации об этой «особенности»; http://www.mingw.org/wiki/Posix_path_conversion . Префикс пути с двойной косой чертой (//bin/bash) должен предотвратить это, или вы можете установить MSYS_NO_PATHCONV=1, см. Как остановить MinGW и MSYS от искажения имен путей, указанных в командной строке.

Благодаря igul ответ я смог запустить это на машине Windows. Были две проблемы:

  1. Путь к скрипту в Docker-контейнере.
    Вместо:

    docker exec a_db /root/db/dev/init_db.sh
    

    должно быть:

    docker exec a_db root/db/dev/init_db.sh
    
  2. Концы строк в init_db.sh. На машине с Windows после извлечения репозитория из конца строки bitbucket файл init_db.sh был настроен на CRLF, что вызвало проблему. Я добавил в репозиторий файл.gitattribute, и теперь файл init_db.sh всегда имеет LF-окончания.

У меня была похожая проблема... абсолютные пути с фиксированными переменными windows мои: $HOME/docker/...

Другие вопросы по тегам