Легкий доступ к файлам в контейнере 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