DEV Community

Lazy coder
Lazy coder

Posted on

1

How to debug image build with Dockerfile

How to debug image build with Dockerfile

Dockerfile to build the env for Ruby on Rails App

FROM ruby
# install essential libs/commands
RUN apt-get update && apt-get install lib-ssl
...
# install gems
RUN bundle install
...
# install npm
RUN yarn install
COMMAND bundle exec rails server
Enter fullscreen mode Exit fullscreen mode
  1. delete the following part causing errors
FROM busybox
RUN echo 'hello world' > /tmp/test

RUN exit 1
....
RUN echo 'ready'
Enter fullscreen mode Exit fullscreen mode

RUN exit 1
Just remove RUN exit 1 and the following

  1. run intermediate image with sha Turn off buildkit to get the sha for each layer docker run --rm -it current sh to debug
DOCKER_BUILDKIT=0 docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> abaa813f94fd
Step 2/3 : RUN echo 'hello world'
 ---> Using cache
 ---> 551ba8324834
Step 3/3 : RUN exit 1
 ---> Running in 5e3c523c38a3
The command '/bin/sh -c exit 1' returned a non-zero code: 1
Enter fullscreen mode Exit fullscreen mode
# pick sha of last successful layer
docker run --rm -it 551ba8324834 sh
Enter fullscreen mode Exit fullscreen mode
  1. nsenter to debug

Enter into the name space of the process.
Namespaces are a feature of the Linux kernel that partitions kernel resources such that one set of processes sees one set of resources while another set of processes sees a different set of resources.

  • add RUN sleep infinite to Dockerfile
  • docker run -it --rm --privileged --pid=host justincormack/nsenter1 to get to the building host 1
  • ps -ef|grep sleep to find pid
  • nsenter -p -m -u -i -n -t 10012 sh
FROM busybox
RUN echo 'hello world'
RUN sleep infinite
RUN exit 1
Enter fullscreen mode Exit fullscreen mode
❯ docker build -t test  .
[+] Building 10.7s (5/7)
 => [internal] load build definition from Dockerfile                                                                                             0.0s
 => => transferring dockerfile: 73B                                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/busybox:latest                                                                                0.0s
 => [1/4] FROM docker.io/library/busybox                                                                                                         0.0s
 => CACHED [2/4] RUN echo 'hello world'                                                                                                          0.0s
 => [3/4] RUN sleep infinite
Enter fullscreen mode Exit fullscreen mode
  1. use target to build sucessfully the image multiple-stage builds
FROM busybox as working
RUN echo 'hello world'

FROM working as error
RUN exit 1
Enter fullscreen mode Exit fullscreen mode
# build image with target
docker build -t test --target working .

# run image to debug
docker run --rm -it test sh
Enter fullscreen mode Exit fullscreen mode

docker run --privileged --pid=host -it alpine \
nsenter -t 1 -m -u -n -i sh
Enter fullscreen mode Exit fullscreen mode
  • --rm : removes the container after it is stopped -ti (or -t -i) : adds a tty and leaves the standard input opened
  • --privileged : grants additional permissions to the container, it allows the container to gain access to the devices of the host (/dev)
  • --pid=host : allows the containers to use the processus tree of the Docker host (the VM in which the Docker daemon is running)

check pid

❯ docker run -ti --rm busybox sh
❯ docker ps
❯ docker inspect --format '{{.State.Pid}}' a57c56a83e54
18762
Enter fullscreen mode Exit fullscreen mode

  1. althernative way using alpine and nsenter command 

Quadratic AI

Quadratic AI – The Spreadsheet with AI, Code, and Connections

  • AI-Powered Insights: Ask questions in plain English and get instant visualizations
  • Multi-Language Support: Seamlessly switch between Python, SQL, and JavaScript in one workspace
  • Zero Setup Required: Connect to databases or drag-and-drop files straight from your browser
  • Live Collaboration: Work together in real-time, no matter where your team is located
  • Beyond Formulas: Tackle complex analysis that traditional spreadsheets can't handle

Get started for free.

Watch The Demo 📊✨

Top comments (0)

Jetbrains Survey

Calling all developers!

Participate in the Developer Ecosystem Survey 2025 and get the chance to win a MacBook Pro, an iPhone 16, or other exciting prizes. Contribute to our research on the development landscape.

Take the survey

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️