в docker, tips

Docker совет №30: Монтирование ssh-ключей в docker-контейнер


Казалось бы, все очень просто — монтируете нужный каталог с ssh-ключами в соответствующее место внутри docker-контейнера. Но все становится куда интереснее, если вы используете Docker for Windows — давайте разберемся!

Эта «простая» команда выглядит так (в качестве примера возьмем образ alpine):

docker run --rm -it -v ~/.ssh:/root/.ssh:ro alpine

и она прекрасно сработает, если ваша операционная система Linux или MacOS. Дополнительный флаг :ro позволяет монтировать том в docker-контейнер с правами только для чтения (чтобы случайно не испортить свои ssh-ключи).

Но при работе в Windows (в частности в WSL — Windows Subsystem for Linux) появляются две проблемы. Первая — Windows «не понимает» права доступа к файлам Linux. Поэтому внутри docker-контейнера каталог и его содержимое (ssh-файлы) появятся с правами 777, и, следовательно, работать не будут.

Стоит отметить, что в Windows 10 последнего выпуска (весна 2018) есть возможность монтировать ваши тома (и внешние устройства) в WSL с добавлением метаданных, которые поддерживают передачу прав доступа к файлам Linux, но Docker for Windows все равно смонтирует такой том через CIFS, который «обрежет» метаданные.

Вторая проблема — дополнение к вышеупомянутой: нельзя монтировать файлы, которые существуют непосредственно на вашем WSL-диске. Внутри docker-контейнера смонтированный каталог будет пустым.

Решить данную проблему проще всего с помощью entrypoint-скрипта. Для этого, в каталоге с имеющимся Dockerfile создаем файл docker-entrypoint.sh следующего содержания:

#!/bin/sh
set -e

cp -R /tmp/.ssh /root/.ssh
chmod 700 /root/.ssh
chmod 644 /root/.ssh/id_rsa.pub
chmod 600 /root/.ssh/id_rsa

exec "$@"

После чего в Dockerfile нужно добавить пару строк (перед инструкцией CMD):

...
COPY docker-entrypoint.sh /bin/docker-entrypoint.sh
RUN chmod +x /bin/docker-entrypoint.sh
ENTRYPOINT ["/bin/docker-entrypoint.sh"]
...

Теперь запускаем контейнер с помощью команды:

docker run --rm -it -v /e/backup/home/lebed/.ssh:/tmp/.ssh:ro <your_image>

Примечание. Не забудьте заменить путь /e/backup/home/lebed/.ssh на свое значение.

Добавить комментарий