Search code examples
pythondockerserverweb-deploymentgoogle-cloud-run

Use included XML files in deployed server


I have xml files that reside in the directory like this

src
 |---lib
 |    |---folder
 |    |    |---XML files
 |    |---script.py
 |---app.py

The app.py file runs the codes in script.py, and in script.py it requires the XML files. When I run the server locally (window) I can just use the relative path "lib\folder\'xml files'". But when I deploy my server to Cloud Run, it says the files don't exist.

I've tried to specify the absolute path by doing this in script.py

package_directory = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(package_directory, "folder\'xml files")

and tried changing all backward dash to forward dash, but the error still occurs.

In the dockerfile, I had this:

ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

which I believe to copy everything in the src folder except things specified in .dockerignore, which I had these insides:

Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__pycache__
.pytest_cache

Solution

  • Because Cloud Run requires a container, a good test for you would be to create the container and run it locally. I suspect that it's your container that's incorrect rather than Cloud Run.

    I created the following repro of your code:

    .
    ├── app.py
    ├── Dockerfile
    └── lib
        ├── folder
        │   └── XML files
        │       └── test
        ├── __init__.py
        └── script.py
    

    app.py:

    from lib import script
    
    script.foo()
    

    script.py:

    import os
    
    def foo():
        package_directory = os.path.dirname(os.path.abspath(__file__))
        path = os.path.join(package_directory, "folder/XML files")
    
        for f in os.listdir(path):
            if os.path.isfile(os.path.join(path,f)):
                print(f)
    

    Dockerfile:

    FROM docker.io/python:3.9.9
    
    ENV APP_HOME /app
    WORKDIR ${APP_HOME}
    
    COPY . ./
    
    ENTRYPOINT ["python","app.py"]
    

    And, when I build|run the container, it correctly reports test:

    Q="70734734"
    
    podman build \
    --tag=${Q} \
    --file=./Dockerfile \
    .
    
    podman run \
    --interactive --tty \
    localhost/${Q}
    

    I'm confident that, if I were to push it to Cloud Run, it would work correctly there too.

    NOTE

    1. Try to avoid spaces in directory names; os.path.join accommodates spaces
    2. You describe XML files but your code references xml files
    3. You don't include a full repro of your issue making it more difficult to help you