It works in docker compose because compose handles relative paths for the volumes, the docker CLI doesn't.
You can achieve this by doing something like
docker run -v $(pwd):/data ...
pwd is a command that returns the current path as an absolute path, you can just run it by itself to see this. $() syntax is to execute the inner command separately before the shell runs the rest of it. (Same as backticks, just better practice)
I imagine that wouldn't work on windows, but it would on either osx, Linux or wsl.
Generally speaking, if you need the file system access and your CLI requires some setup, I'd recommend either writing it in a statically compiled language (e.g. golang, rust) or researching how to compile a python script into an executable.
If you're just mounting your script in the container - you're better off adding it directly at build time.
Thanks for the thorough answer, really appreciate it.
You sure had my hopes up a bit too 😁 but it doesn't work. I also tried with the absolute path (from pwd) and others to no avail, docker run has an "inner" working dir of /data/ still. Guess it can't be ./
Funny you are talking about compiling and such, the project is in python and I have frozen executables (not the most elegant solution, but its fire up and forget for the user), I just thought it simpler in a docker image.
So back to the drawing board to figure out the best way to tackle it all. As I do have one image running a server, I could make it take commandline arguments and dispatch, but it's not exactly a beautiful solution. Or make the softs work in a designated directory.
I think I misunderstood your problem, I assumed the issue was the volume mounts and after testing it I was indeed wrong - the docker cli now accepts relative paths so your original command does the same as what I suggested. After re-reading your issue I have a different idea of what's wrong, but would have to see your dockerfile (or for you to confirm) to be sure.
Do you add 10f.py to the docker image when you build it and do you specify the command/entrypoint in the Dockerfile? There are possibly to issues I can think of with how you do that (although considering the docker compose works it's probably the 2nd):
You do add it and you add it to /data in the image - when you mount a volume over it would make the script no longer exist in the container.
You do add it and it's not in /data - in this case the issue with running docker run -v ./:/data -w /workdir tenfigers_10f:v1 10f.py is the last bit - you override the command which makes it try to look for it at /data/10f.py, if you omit it the last part (10f.py) it should run whatever the original command was and assuming you set the cmd/entrypoint correctly in the Dockerfile it should see /data as ./ in python.
(Also when you run it with the CLI you might want to add -it --rm as well to the docker command otherwise it won't really behave similarly to a regular command)