Accessing Files on a Windows Docker Container Easily
Clash Royale CLAN TAG#URR8PPP
Accessing Files on a Windows Docker Container Easily
So I'm trying to figure out a way to use docker to be able to spin up testing environments for customers rather easily. Basically, I've got a customized piece of software that want to install to a Windows docker container (microsoft/windowsservercore), and I need to be able to access the program folder for that software (C:Program FilesSOFTWARE_NAME) as it has some logs, imports/exports, and other miscellaneous configuration files. The installation part was easy, and I figured that after a few hours of messing around with docker and learning how it works, but transferring files in a simple manner is proving far more difficult than I would expect. I'm well aware of the docker cp
command, but I'd like something that allows for the files to be viewed in a file browser to allow testers to quickly/easily view log/configuration files from the container.
docker cp
I've spent 20+ hours monkeying around with running an SSH server on the docker container, so I could just ssh in and move files back and forth, but I've had no luck. I've spent most of my time trying to configure OpenSSH, and I can get it installed, but there appears to be something wrong with the default configuration file provided with my installation, as I can't get it up and running unless I start it manually via command line by running sshd -d
. Strangely, this runs just fine, but it isn't really a viable solution as it is running in debug mode and shuts down as soon as the connection is closed. I can provide more detail on what I've tested with this, but it seems like it might be a dead end (even though I feel like this should be extremely simple). I've followed every guide I can find (though half are specific to linux containers), and haven't gotten any of them to work, and half the posts I've found just say "why would you want to use ssh when you can just use the built in docker commands". I want to use ssh because it's simpler from an end user's perspective, and I'd rather tell a tester to ssh to a particular IP than make them interact with docker via the command line.
sshd -d
EDIT: Using OpenSSH
Starting server using net start sshd
, which reports it starting successfully, however, the service stops immediately if I haven't generated at least an RSA or DSA key using:
net start sshd
ssh-keygen.exe -f "C:\Program Files\OpenSSH-Win64/./ssh_host_rsa_key" -t rsa
And modifying the permissions using:
icacls "C:Program FilesOpenSSH-Win64/" /grant sshd:(OI)(CI)F /T
and
icacls "C:Program FilesOpenSSH-Win64/" /grant ContainerAdministrator:(OI)(CI)F /T
Again, I'm using the default supplied sshd_config file, but I've tried just about every adjustment of those settings I can find and none of them help.
I also attempted to setup Volumes to do this, but because the installation of our software is done at compile time in docker, the folder that I want to map as a volume is already populated with files, which seems to make docker fail when I try to start the container with the volume attached. This section of documentation seems to say this should be possible, but I can't get it to work. Keep getting errors when I try to start the container saying "the directory is not empty".
EDIT: Command used:
docker run -it -d -p 9999:9092 --mount source=my_volume,destination=C:/temp my_container
Running this on a ProxMox VM.
At this point, I'm running out of ideas, and something that I feel like should be incredibly simple is taking me far too many hours to figure out. It particularly frustrates me that I see so many blog posts saying "Just use the built in docker cp command!" when that is honestly a pretty bad solution when you're going to be browsing lots of files and viewing/editing them. I really need a method that allows the files to be viewed in a file browser/notepad++.
Is there something obvious here that I'm missing? How is this so difficult? Any help is appreciated.
Also, is your Docker runs on a virtual machine (VirtualBox/VMware)?
– Praveen P
Aug 9 at 20:04
Could you please tell us exactly what SSH server you are using in your Windows docker container, and how exactly you have tried to start it (when not starting it manually via command line)?
– Binarus
Aug 9 at 20:05
Post updated with the requested info @PraveenP Let me know if you need anything else.
– Nealon
Aug 9 at 20:17
Post updated with the requested info @Binarus Let me know if you need anything else.
– Nealon
Aug 9 at 20:17
2 Answers
2
So after a fair bit more troubleshooting, I was unable to get the docker volume to initialize on an already populated folder, even though the documentation suggests it should be possible.
So, I instead decided to try to start the container with the volume linked to an empty folder, and then start the installation script for the program after the container is running, so the folder populates after the volume is already linked. This worked perfectly! There's a bit of weirdness if you leave the files in the volume and then try to restart the container, as it will overwrite most of the files, but things like logs and files not created by the installer will remain, so we'll have to figure out some process for managing that, but it works just like I need it to, and then I can use windows sharing to access that volume folder from anywhere on the network.
Here's how I got it working, it's actually very simple.
So in my dockerfile, I added a batch script that unzips the installation DVD that is copied to the container, and runs the installer after extracting. I then used the CMD option to run this on container start:
Dockerfile
FROM microsoft/windowsservercore
ADD DVD.zip C:\resources\DVD.zip
ADD config.bat C:\resources\config.bat
CMD "C:resourcesconfig.bat" && cmd
Then I build the container without anything special:
docker build -t my_container:latest .
And run it with the attachment to the volume:
docker run -it -d -p 9999:9092 --mount source=my_volume,destination="C:/Program Files (x86)/PROGRAM NAME" my_container
And that's it. Unfortunately, the container takes a little longer to start (it does build faster though, for what that's worth, as it isn't running the installer in the build), and the program isn't installed/running for another 5 minutes or so after the container does start, but it works!
I can provide more details if anyone needs them, but most of the rest is implementation specific and fairly straightforward.
Try this with Docker composer. Unfortunately, I cannot test it as I'm using a Mac it's not a "supported platform" (way to go Windows). See if that works, if not try volume
line like this instead - ./my_volume:C:/tmp/
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:tmpprogram.exe", "any-parameter"]
Docker Composer
Should ideally be in the parent folder.
version: "3"
services:
windows:
build: ./folder-of-Dockerfile
volume:
- type: bind
source: ./my_volume
target: C:/tmp/
ports:
- 9999:9092
Folder structure
|---docker-composer.yml
|
|---folder-of-Dockerfile
|
|---Dockerfile
Just run docker-composer up
to build and start the container. Use -d
for detach mode, should only use once you know its working properly.
docker-composer up
-d
Useful link Manage Windows Dockerfile
I'm getting an error:
ERROR: for windows Cannot create container for service windows: invalid volume specification: 'C:dockermy_volume:/c/temp/:rw'
I tried making sure I had declared the volume using docker volume create my_volume
before, but that doesn't seem to help.– Nealon
Aug 13 at 13:32
ERROR: for windows Cannot create container for service windows: invalid volume specification: 'C:dockermy_volume:/c/temp/:rw'
docker volume create my_volume
It could be just
/c/
that Unix substitution of Windows file paths. You can try 'C:'
instead to see if that works.– Praveen P
Aug 13 at 17:16
/c/
'C:'
That seems to have worked... thanks for that, but either I'm misunderstanding the use of Docker compose, or it's doing something strange. I get a
old_windows_1 exited with code 0
message before the command prompt returns to allow user input, and when I run docker container ls
, the container doesn't show as running. Also, the volume folder on the VM is empty.– Nealon
Aug 13 at 17:21
old_windows_1 exited with code 0
docker container ls
Just as an update, still dealing with those HNS errors. I think there might be something wrong with the VM I'm using at this point... I'll update when I'm able to test moving the volume to the D drive.
– Nealon
Aug 14 at 19:32
Just FYI, I got the solution I describe above to work, and posted my own answer describing it in more detail. Thank you very much for all of your troubleshooting help with all of this!
– Nealon
Aug 23 at 15:13
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Could you post the exact docker command that you've used to mount the volume, please? There is a restriction on which order the options should be in for it to work, I've learned this the hard way.
– Praveen P
Aug 9 at 20:00