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. Были две проблемы:
Путь к скрипту в Docker-контейнере.
Вместо:docker exec a_db /root/db/dev/init_db.sh
должно быть:
docker exec a_db root/db/dev/init_db.sh
Концы строк в init_db.sh. На машине с Windows после извлечения репозитория из конца строки bitbucket файл init_db.sh был настроен на CRLF, что вызвало проблему. Я добавил в репозиторий файл.gitattribute, и теперь файл init_db.sh всегда имеет LF-окончания.
У меня была похожая проблема... абсолютные пути с фиксированными переменными windows мои: $HOME/docker/...