DEV Community

Suleyman Poyraz
Suleyman Poyraz

Posted on

3 2

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.

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more