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

Jul 5, 2018 07:09 · 270 words · 2 minute read docker docker-compose

Казалось бы, все очень просто - монтируете нужный каталог с 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 на свое значение.

tweet Share