skip to Main Content

I currently have a Python application running in a Docker container on Ubuntu 20.04.

In this Python application I want to create a text file every few minutes for use in other applications on the Ubuntu server. However, I am finding it challenging to create a file and save it on the server from inside a containerised Python application.

The application Dockerfile/start.sh/main.py files reside in /var/www/my_app_name/ and I would like to have the output.txt file that main.py creates in that same folder, the location of the Dockerfile/main.py source.

The text file is created in Python using a simple line:

text_file = open("my_text_file.txt", "wt")

I have seen that the best way to do this is to use a volume. My current docker run which is called by batch script start.sh includes the line:

docker run -d --name=${app} -v $PWD:/app ${app}

However I am not having much luck and the file is not created in the working directory where main.py resides.

2

Answers


  1. Chosen as BEST ANSWER

    Ended up solving this myself, thanks to those who answered to get me on the right path.

    For those finding this question in the future, creating a bind mound using the -v flag in docker run is indeed the correct way to go, just ensure that you have the correct path.

    To get the file my_text_file.txt in the folder where my main.py and Dockerfile files are located, I changed my above to:

    -v $PWD:/src/output ${app}
    

    The /src/output is a folder structure within the container where my_text_file.txt is created, so in the Python, you should be saving the file using:

    text_file = open("/src/output/my_text_file.txt", "wt")
    

    The ${PWD} is where the my_text_file.txt is located on the local machine.

    In short, I was not saving my file to the correct folder within the container in the Python code, it should have been saved to app in the container, and then my solution in the OP would have worked.


  2. A bind mount is the way to go and your -v $PWD:/app should work.

    If you run a command like

    docker run --rm -v $PWD:/app alpine /bin/sh -c 'echo Hello > /app/hello.txt'
    

    you’ll get a file in your current directory called hello.txt.

    The command runs an Alpine image, maps the current directory to /app in the container and then echoes ‘Hello’ to /app/hello.txt in the container.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search