DEV Community

Suleyman Poyraz
Suleyman Poyraz

Posted on

Statik Docker Uygulaması Oluşturma

Docker konteyner'larının en büyük dezavantajı kendi libc kütüphanesini veya uygulamalara ait diğer bağımlılıkların konteyner içerisinde olması gerekmektedir. Bunu aşmak için statik uygulamalar oluşturmak en kolay yollardan birisi.

Bir Örnek

Bir uygulama örneği oluşturalım. Mesela, bir merhaba dünya kodu oluşturalım ve bunu hello.cc dosyası içerisine yazdıralım.

#include<iostream>

using namespace std;
int main(){
    cout << "Merhaba, dünya!\n ";
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

GCC kullanarak bu kodu derleyelim

g++ -o hello hello.cc
Enter fullscreen mode Exit fullscreen mode

Bu şekilde derlemiş olduğumuz kodlar dinamik olarak linklenmiş olur. Ve bu uygulamanın bağımlılıklarını ldd ile listeleyelim.

ldd hello
        linux-vdso.so.1 =>  (0x00007ffc0075c000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f88c92d0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88c8f06000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f88c8bfc000)
        /lib64/ld-linux-x86-64.so.2 (0x0000558132cbf000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f88c89e6000)
Enter fullscreen mode Exit fullscreen mode

Eğer ki bu kodu ikili dosyayı scratch docker imajı içerisinde çalıştırmaya çalışırsak muhtemel olarak hata alacağız ve çalışmayacak. Eğer çalışmasını istersek yukarıdaki bağımlılıkları imaj içerisine eklememiz gerekecek ve bu sebeple imaj şişecek.

Ancak biz bu uygulamayı statik olarak linklersek bu hataya maruz kalmadan ve imajı şişirmeden ve bağımlılıklarla boğuşmadan ikili çalıştırılabilir dosyalar elde ederiz. Bunun için mevcut komut -static parametresi eklemek yeterlidir.

g++ -o hello -static hello.cc
Enter fullscreen mode Exit fullscreen mode

Şimdi de bağımlılıkları kontrol edelim.

ldd hello
        not a dynamic executable
Enter fullscreen mode Exit fullscreen mode

Bu şekilde statik derlenmiş ikili dosyalar docker imajı içerisinde ek bir dosyaya veya bağımlılığa ihtiyaç duymadan çalışır. Şimdi de bir Dockerfile oluşturalım.

cat > Dockerfile <<EOF
FROM scratch
ADD hello /
CMD ["/hello"]
EOF
Enter fullscreen mode Exit fullscreen mode

Bu Dockerfile ile bir imaj inşaa edelim.

docker build --tag hello .
Enter fullscreen mode Exit fullscreen mode

Şimdi de docker imajını çalıştıralım.

docker run hello
Merhaba, dünya!
Enter fullscreen mode Exit fullscreen mode

Örnekte gördüğünüz gibi daha küçük docker imajları oluşturmak veya gereksiz bağımlılıklardan kurtulmak için bu yöntemi kullanabilirsiniz.

Top comments (0)