Скрипт My Docker работает так, как задумано, когда текущий рабочий каталог не содержит пробелов, однако при этом возникает ошибка.
Я упростил пример, чтобы использовать наименьшее официальное изображение Docker Iмог бы найти и хорошо известную утилиту ядра GNU.Конечно, этот пример не очень полезен.В моем случае использования в реальном мире упаковывается гораздо более сложная среда.
Скрипт Docker Wrapper:
#!/usr/bin/env bash
##
## Dockerized ls
##
set -eux
# Only allocate tty if one is detected
# See /758520/kak-opredelit-rabotaet-li-moi-stsenarii-obolochki-cherez-kanal
if [[ -t 0 ]]; then
DOCKER_RUN_OPTIONS+="-i "
fi
if [[ -t 1 ]]; then
DOCKER_RUN_OPTIONS+="-t "
fi
WORK_DIR="$(realpath .)"
DOCKER_RUN_OPTIONS+="--rm --user=$(id -u $(logname)):$(id -g $(logname)) --workdir=${WORK_DIR} --mount type=bind,source=${WORK_DIR},target=${WORK_DIR}"
exec docker run ${DOCKER_RUN_OPTIONS} busybox:latest ls "$@"
Вы можете сохранить это где-нибудь как /tmp/docker_ls
дляпример.Не забудьте chmod +x /tmp/docker_ls
Теперь вы можете использовать Dockerized ls в любом пути, который не содержит пробелов, как указано ниже:
/tmp/docker_ls -lah
/tmp/docker_ls -lah | grep 'r'
Обратите внимание, что /tmp/docker_ls -lah /path/to/something
не реализовано.Сценарий оболочки должен быть адаптирован для анализа параметров и монтирования аргумента пути в контейнер.
Можете ли вы понять, почему это не будет работать, если текущий путь к рабочей директории содержит пробелы?Что можно сделать, чтобы исправить это?
Решение:
@ Дэвид-лабиринт решил проблему.Пожалуйста, смотрите: https://stackoverflow.com/a/55763212/1782641
Используя его советы, я переработал свой сценарий следующим образом:
#!/usr/bin/env bash
##
## Dockerized ls
##
set -eux
# Only allocate tty if one is detected. See - https://stackoverflow.com/questions/911168
if [[ -t 0 ]]; then IT+=(-i); fi
if [[ -t 1 ]]; then IT+=(-t); fi
USER="$(id -u $(logname)):$(id -g $(logname))"
WORKDIR="$(realpath .)"
MOUNT="type=bind,source=${WORKDIR},target=${WORKDIR}"
exec docker run --rm "${IT[@]}" --user "${USER}" --workdir "${WORKDIR}" --mount "${MOUNT}" busybox:latest ls "$@"