DEV Community

Lazy coder
Lazy coder

Posted on

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 

Top comments (0)