HomeSample Page

Sample Page Title


Debugging Python in Docker: A Tutorial for Beginners
Picture by Writer | Ideogram

 

Introduction

 
Docker has simplified how we develop, ship, and run functions by offering constant environments throughout completely different programs. Nevertheless, this consistency comes with a trade-off: debugging turns into deceptively complicated for newcomers when your functions — together with Python functions — are working inside Docker containers.

For these new to Docker, debugging Python functions can really feel like attempting to repair a automobile with the hood welded shut. You realize one thing’s fallacious, however you’ll be able to’t fairly see what’s taking place inside.

This beginner-friendly tutorial will train you how you can get began with debugging Python in Docker.

 

Why is Debugging in Docker Totally different?

 
Earlier than we dive in, let’s perceive why Docker makes debugging difficult. Whenever you’re working Python regionally in your machine, you’ll be able to:

  • See error messages instantly
  • Edit information and run them once more
  • Use your favourite debugging instruments
  • Test what information exist and what’s in them

However when Python runs inside a Docker container, it is usually trickier and fewer direct, particularly in case you’re a newbie. The container has its personal file system, its personal atmosphere, and its personal working processes.

 

Setting Up Our Instance

 
Let’s begin with a easy Python program that has a bug. Don’t fret about Docker but; let’s first perceive what we’re working with.

Create a file known as app.py:

def calculate_sum(numbers):
    whole = 0
    for num in numbers:
        whole += num
        print(f"Including {num}, whole is now {whole}")
    return whole

def important():
    numbers = [1, 2, 3, 4, 5]
    outcome = calculate_sum(numbers)
    print(f"Ultimate outcome: {outcome}")
    
    # This line will trigger our program to crash!
    division_result = 10 / 0
    print(f"Division outcome: {division_result}")

if __name__ == "__main__":
    important()

 

In case you run this usually with python3 app.py, you will see it calculates the sum accurately however then crashes with a “division by zero” error. Simple to identify and repair, proper?

Now let’s see what occurs when this easy software runs inside a Docker container.

 

Creating Your First Docker Container

 
We have to inform Docker how you can bundle our Python program. Create a file known as `Dockerfile`:

FROM python:3.11-slim

WORKDIR /app

COPY app.py .

CMD ["python3", "app.py"]

 

Let me clarify every line:

  • FROM python:3.11-slim tells Docker to begin with a pre-made Linux system that already has Python put in
  • WORKDIR /app creates an `/app` folder contained in the container and units it because the working listing
  • COPY app.py . copies your app.py file out of your pc into the `/app` folder contained in the container
  • CMD ["python3", "app.py"] tells Docker what command to run when the container begins

Now let’s construct and run this container:

docker construct -t my-python-app .
docker run my-python-app

 

You will see the output, together with the error, however then the container stops and exits. This leaves you to determine what went fallacious contained in the remoted container.

 

1. Operating an Interactive Debugging Session

 
The primary debugging talent you want is studying how you can get inside a working container and verify for potential issues.

As an alternative of working your Python program instantly, let’s begin the container and get a command immediate inside it:

docker run -it my-python-app /bin/bash

 

Let me break down these new flags:

  • -i means “interactive” — it retains the enter stream open so you’ll be able to kind instructions
  • -t allocates a “pseudo-TTY” — principally, it makes the terminal work correctly
  • /bin/bash overrides the traditional command and provides you a bash shell as an alternative

Now that you’ve a terminal contained in the container, you’ll be able to run instructions like so:

# See what listing you are in
pwd

# Checklist information within the present listing
ls -la

# Have a look at your Python file
cat app.py

# Run your Python program
python3 app.py

 

You will additionally see the error:

root@fd1d0355b9e2:/app# python3 app.py
Including 1, whole is now 1
Including 2, whole is now 3
Including 3, whole is now 6
Including 4, whole is now 10
Including 5, whole is now 15
Ultimate outcome: 15
Traceback (most up-to-date name final):
  File "/app/app.py", line 18, in 
    important()
  File "/app/app.py", line 14, in important
    division_result = 10 / 0
                      ~~~^~~
ZeroDivisionError: division by zero

 

Now you’ll be able to:

  • Edit the file proper right here within the container (although you will want to put in an editor first)
  • Discover the atmosphere to know what’s completely different
  • Check small items of code interactively

Repair the division by zero error (possibly change `10 / 0` to `10 / 2`), save the file, and run it once more.

The issue is mounted. Whenever you exit the container, nevertheless, you lose monitor of modifications you made. This brings us to our subsequent approach.

 

2. Utilizing Quantity Mounting for Reside Edits

 
Would not or not it’s good in case you may edit information in your pc and have these modifications routinely seem contained in the container? That is precisely what quantity mounting does.

docker run -it -v $(pwd):/app my-python-app /bin/bash

 

The brand new half right here is -v $(pwd):/app:

  • $(pwd) outputs the present listing path.
  • :/app maps your present listing to /app contained in the container.
  • Any file you alter in your pc instantly modifications contained in the container too.

Now you’ll be able to:

  1. Edit app.py in your pc utilizing your favourite editor
  2. Contained in the container, run python3 app.py to check your modifications
  3. Hold modifying and testing till it really works

This is a pattern output after altering the divisor to 2:

root@3790528635bc:/app# python3 app.py
Including 1, whole is now 1
Including 2, whole is now 3
Including 3, whole is now 6
Including 4, whole is now 10
Including 5, whole is now 15
Ultimate outcome: 15
Division outcome: 5.0

 

That is helpful since you get to make use of your acquainted modifying atmosphere in your pc and the very same atmosphere contained in the container as nicely.

 

3. Connecting a Distant Debugger from Your IDE

 
In case you’re utilizing an Built-in Growth Atmosphere (IDE) like VS Code or PyCharm, you’ll be able to really join your IDE’s debugger on to code working inside a Docker container. This offers you the complete energy of your IDE’s debugging instruments.

Edit your `Dockerfile` like so:

FROM python:3.11-slim

WORKDIR /app

# Set up the distant debugging library
RUN pip set up debugpy

COPY app.py .

# Expose the port that the debugger will use
EXPOSE 5678

# Begin this system with debugger help
CMD ["python3", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]

 

What this does:

  • pip set up debugpy installs Microsoft’s debugpy library.
  • EXPOSE 5678 tells Docker that our container will use port 5678.
  • The CMD begins our program by the debugger, listening on port 5678 for a connection. No modifications to your Python code are wanted.

Construct and run the container:

docker construct -t my-python-app .
docker run -p 5678:5678 my-python-app

 

The -p 5678:5678 maps port 5678 from contained in the container to port 5678 in your pc.

Now in VS Code, you’ll be able to arrange a debug configuration (in .vscode/launch.json) to hook up with the container:

{
    "model": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            }
        }
    ]
}

 

Whenever you begin debugging in VS Code, it’ll hook up with your container, and you’ll set breakpoints, examine variables, and step by code similar to you’d with native code.

 

Widespread Debugging Issues and Options

 
⚠️ “My program works on my pc however not in Docker”

This normally means there is a distinction within the atmosphere. Test:

  • Python model variations.
  • Lacking dependencies.
  • Totally different file paths.
  • Atmosphere variables.
  • File permissions.

⚠️ “I can not see my print statements”

  • Use python -u to keep away from output buffering.
  • Be sure to’re working with -it if you would like interactive output.
  • Test in case your program is definitely working as supposed (possibly it is exiting early).

⚠️ “My modifications aren’t exhibiting up”

  • Be sure to’re utilizing quantity mounting (-v).
  • Test that you just’re modifying the proper file.
  • Confirm the file is copied into the container.

⚠️ “The container exits instantly”

  • Run with /bin/bash to examine the container’s state.
  • Test the error messages with docker logs container_name.
  • Make certain your CMD within the Dockerfile is right.

 

Conclusion

 
You now have a primary toolkit for debugging Python in Docker:

  1. Interactive shells (docker run -it ... /bin/bash) for exploring and fast fixes
  2. Quantity mounting (-v $(pwd):/app) for modifying in your native file system
  3. Distant debugging for utilizing your IDE’s full capabilities

After this, you’ll be able to attempt utilizing Docker Compose for managing complicated functions. For now, begin with these easy methods. Most debugging issues may be solved simply by getting contained in the container and poking round.

The hot button is to be methodical: perceive what must be taking place, determine what is definitely taking place, after which bridge the hole between the 2. Joyful debugging!
 
 

Bala Priya C is a developer and technical author from India. She likes working on the intersection of math, programming, information science, and content material creation. Her areas of curiosity and experience embody DevOps, information science, and pure language processing. She enjoys studying, writing, coding, and low! At the moment, she’s engaged on studying and sharing her information with the developer group by authoring tutorials, how-to guides, opinion items, and extra. Bala additionally creates partaking useful resource overviews and coding tutorials.



Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles