Легкий доступ к файлам в контейнере Windows Docker

резюме

поэтому я пытаюсь найти способ использовать docker, чтобы иметь возможность довольно легко создавать среды тестирования для клиентов. В принципе, у меня есть настроенное программное обеспечение, которое нужно установить в контейнер Windows docker (microsoft / windowsservercore), и мне нужно иметь доступ к папке программы для этого программного обеспечения (C:Program FilesSOFTWARE_NAME), поскольку он имеет некоторые журналы, импорт/экспорт и другие файлы конфигурации. Установка части было легко, и я решил, что после нескольких часов возни с Докером и изучения того, как он работает, но передача файлов простым способом оказывается намного сложнее, чем я ожидал. Я хорошо осведомлен о docker cp command, но я хотел бы что-то, что позволяет просматривать файлы в файловом браузере, чтобы тестеры могли быстро/легко просматривать файлы журнала/конфигурации из контейнера.

фон (что я пробовал):

я провел 20 + часов обезьянничая вокруг с запуском SSH-сервера в контейнере docker, поэтому я мог бы просто ssh и перемещать файлы туда и обратно, но мне не повезло. Я потратил большую часть своего времени, пытаясь настроить OpenSSH, и я могу его установить, но, похоже, что-то не так с файлом конфигурации по умолчанию, предоставленным с моей установкой, поскольку я не могу его запустить, если я не запускаю его вручную через командную строку, запустив sshd -d. Как ни странно, это работает просто отлично, но это не очень эффективное решение, как он работает в режиме отладки и выключается как только соединение закрывается. Я могу предоставить более подробную информацию о том, что я тестировал с этим, но кажется, что это может быть тупик (хотя я чувствую, что это должно быть очень простой). Я следил за каждым руководством, которое я могу найти (хотя половина специфична для контейнеров linux), и не получил ни одного из них, и половина сообщений, которые я нашел, просто говорят: "почему вы хотите использовать ssh, когда вы можете просто использовать встроенный докер команды." Я хочу использовать ssh, потому что это проще с точки зрения конечного пользователя, и я бы предпочел сказать тестеру ssh на конкретный IP, чем заставить их взаимодействовать с docker через командную строку.

EDIT: использование OpenSSH

запуск сервера с помощью net start sshd, который сообщает об успешном запуске, однако Служба немедленно останавливается, если я не создал хотя бы ключ RSA или DSA, используя:

ssh-keygen.exe -f "C:Program FilesOpenSSH-Win64/./ssh_host_rsa_key" -t rsa

и изменение разрешения использование:

icacls "C:Program FilesOpenSSH-Win64/" /grant sshd:(OI)(CI)F /T

и

icacls "C:Program FilesOpenSSH-Win64/" /grant ContainerAdministrator:(OI)(CI)F /T

опять же, я использую файл sshd_config по умолчанию, но я пробовал почти каждую настройку этих параметров, которые я могу найти, и ни один из них не помогает.

Я также попытался настроить Тома для этого, но поскольку установка нашего программного обеспечения выполняется во время компиляции в docker, папка, которую я хочу отобразить как Том, уже заполнена файлами, что, похоже, делает docker неудачным, когда я пытаюсь запустить контейнер с прикрепленным Томом. этой в разделе документации, кажется, говорится, что это должно быть возможно, но я не могу заставить его работать. Продолжайте получать ошибки, когда я пытаюсь запустить контейнер, говоря: "каталог не пуст".

EDIT: используется команда:

docker run -it -d -p 9999:9092 --mount source=my_volume,destination=C:/temp my_container

на ProxMox VM.

на данный момент у меня заканчиваются идеи, и что-то, что я чувствую, должно быть невероятно простым, тоже берет меня далеко много часов, чтобы понять. Это особенно расстраивает меня, что я вижу так много сообщений в блоге, говорящих: "просто используйте встроенную команду docker cp!"когда это честно довольно плохое решение, когда вы собираетесь просматривать много файлов и просматривать/редактировать их. Мне действительно нужен метод, который позволяет просматривать файлы в браузере файлов/notepad++.

есть ли здесь что-то очевидное, чего мне не хватает? Почему это так трудно? Любая помощь приветствуется.

2 ответов


таким образом, после устранения неполадок я не смог получить том docker для инициализации в уже заполненной папке, хотя документация предполагает, что это должно быть возможно.

поэтому я вместо этого решил попытаться запустить контейнер с Томом, связанным с пустой папкой, а затем запустить сценарий установки для программы после запуска контейнера, поэтому папка заполняется после того, как Том уже связан. Это сработало идеально! Есть немного странности, если вы оставите файлы в томе, а затем попытаетесь перезапустить контейнер, так как он перезапишет большинство файлов, но такие вещи, как журналы и файлы, не созданные установщиком, останутся, поэтому нам придется выяснить какой-то процесс для управления этим, но он работает так же, как мне нужно, а затем я могу использовать общий доступ к windows для доступа к этой папке тома из любой точки сети.

вот как я заставил его работать, это на самом деле очень простой.

поэтому в моем dockerfile я добавил пакетный скрипт, который распаковывает установочный DVD, скопированный в контейнер, и запускает установщик после извлечения. Затем я использовал опцию CMD для запуска этого при запуске контейнера:

Dockerfile

FROM microsoft/windowsservercore

ADD DVD.zip C:\resources\DVD.zip
ADD config.bat C:\resources\config.bat

CMD "C:\resources\config.bat" && cmd

затем я строю контейнер без чего-либо особенного:

docker build -t my_container:latest .

и запустите его с вложением в том:

docker run -it -d -p 9999:9092 --mount source=my_volume,destination="C:/Program Files (x86)/{PROGRAM NAME}" my_container

и это все. К сожалению, контейнер занимает немного больше времени, чтобы начать (он строит быстрее, хотя, для чего это стоит, так как он не запускает установщик в сборке), и программа не установлена/работает в течение еще 5 минут или около того после запуска контейнера, но он работает!

Я могу предоставить более подробную информацию, если кто-то нуждается в них, но большая часть остального является конкретной реализацией и довольно простой.


попробуйте это с Docker composer. К сожалению, я не могу проверить его, поскольку я использую Mac, это не "поддерживаемая платформа" (способ пойти Windows). Посмотрите, работает ли это, если не попробовать volume строку вместо - ./my_volume:C:/tmp/

Dockerfile

FROM microsoft/windowsservercore

# need to ecape \
WORKDIR C:\tmp\

# Add the program from host machine to container
ADD ["<source>", "C:\tmp"]

# Normally used with web servers
# EXPOSE 80

# Running the program
CMD ["C:\tmp\program.exe", "any-parameter"]

Docker Composer

в идеале должно быть в родительской папке.

version: "3"

services:
  windows:
    build: ./folder-of-Dockerfile
    volume:
      - type: bind
        source: ./my_volume
        target: C:/tmp/

    ports:
      - 9999:9092

структура папок

|---docker-composer.yml
    |
    |---folder-of-Dockerfile
        |
        |---Dockerfile

просто запустить docker-composer up для постройте и запустите контейнер. Использовать -d для режима отсоединения следует использовать только после того, как вы знаете, что он работает правильно.

Полезные ссылки Управление Windows Dockerfile