diff --git a/.gitlab/ci/.build-container.yml b/.gitlab/ci/.build-container.yml
index 648feba5377339f5ccd166ae88f13db9d18833c4..d4122a62259caca73b7a2cd97b496963c2007d1a 100644
--- a/.gitlab/ci/.build-container.yml
+++ b/.gitlab/ci/.build-container.yml
@@ -1,16 +1,12 @@
 .build: &build
     stage: build
-    image:
-        name: gcr.io/kaniko-project/executor:debug
-        entrypoint: [""]
+    tags:
+      - shell-builder
     variables:
-        TAG: $CI_COMMIT_BRANCH
+        TAG: $CI_COMMIT_SHA
     before_script:
         # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
-        - cd controller/
         - TAG=${TAG//\//-}
-        - mkdir -p /kaniko/.docker
-        - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
     needs: []
 
 build-testing-image:
@@ -24,15 +20,9 @@ build-testing-image:
               BUILDARGS: -race
         - when: always
     script:
-        - /kaniko/executor
-          --cache=true
-          --context "$CI_PROJECT_DIR"
-          --dockerfile "Dockerfile"
-          --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
-          --build-arg "BUILDARGS=$BUILDARGS"
-          --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
-          --destination "$GOSDN_TESTING_IMAGE"
-          --target "installer"
+        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+        - docker build -t "$GOSDN_TESTING_IMAGE" -f "${CI_PROJECT_DIR}/controller/Dockerfile" --target "installer" --build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "BUILDARGS=$BUILDARGS" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" .
+        - docker push "$GOSDN_TESTING_IMAGE"
     <<: *build
 
 build-image:
@@ -48,13 +38,7 @@ build-image:
               BUILDARGS: -race
         - when: always
     script:
-        - /kaniko/executor
-          --cache=true
-          --context "$CI_PROJECT_DIR"
-          --dockerfile "Dockerfile"
-          --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
-          --build-arg "BUILDARGS=$BUILDARGS"
-          --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
-          --destination "$GOSDN_IMAGE"
-          --destination "$CI_REGISTRY_IMAGE:$TAG"
+        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+        - docker build -t "$CI_REGISTRY_IMAGE:$TAG" -f "${CI_PROJECT_DIR}/controller/Dockerfile" --target "installer" --build-arg "GOLANG_VERSION=$GOLANG_VERSION" --build-arg "BUILDARGS=$BUILDARGS" --build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/" .
+        - docker push "$CI_REGISTRY_IMAGE:$TAG"
     <<: *build
diff --git a/.gitlab/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml
index a37e7243ed64139f927bf28d1afdfdd23ef4ad28..3b0c201e4b222782f60a3790be0f38f599544a4e 100644
--- a/.gitlab/ci/.containerlab-ci.yml
+++ b/.gitlab/ci/.containerlab-ci.yml
@@ -48,7 +48,7 @@ variables:
 containerlab:template:integration:
     extends: .containerlab_template
     variables:
-        CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.tmpl.yml"
+        CLAB_TEMPLATE: "${CI_PROJECT_DIR}/controller/test/containerlab/int01.clab.tmpl.yml"
 
 containerlab:deploy:integration:
     extends: .containerlab_deploy
diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml
index 226d5ce0b0ef158676e1714ed1350c0545e829c1..b494223a2b8104d7d37b9ba316348f815f633375 100644
--- a/.gitlab/ci/.test.yml
+++ b/.gitlab/ci/.test.yml
@@ -15,6 +15,7 @@
 
 unit-test:
     script:
+        - cd controller
         - make ci-unit-test
     after_script:
         - go tool cover -func=coverage.out
@@ -22,6 +23,7 @@ unit-test:
 
 controller-test:
     script:
+        - cd controller
         - make ci-controller-test
     <<: *test
 
@@ -29,5 +31,5 @@ test-build:
     artifacts:
         when: never
     script:
-        - GOOS=linux go build $BUILDARGS ./cmd/gosdn
+        - make build
     <<: *test
diff --git a/controller/Dockerfile b/controller/Dockerfile
index a62551bad85002175b01294022e40fb7d28aaa17..355668ae40bc0beca422f5187b50f355435abe37 100644
--- a/controller/Dockerfile
+++ b/controller/Dockerfile
@@ -1,4 +1,21 @@
-FROM scratch
+ARG GOLANG_VERSION=1.18
+ARG BUILDARGS
+ARG $GITLAB_PROXY
+
+FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-buster AS installer
+
+WORKDIR /src/gosdn/controller
+COPY go.* ./
+RUN go mod download
+
+FROM installer as builder
+
+COPY ./controller ./
+
+RUN make build
+
+
+FROM scratch as gosdn
 
 COPY artifacts/gosdn /