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;
}
GCC kullanarak bu kodu derleyelim
g++ -o hello hello.cc
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)
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
Şimdi de bağımlılıkları kontrol edelim.
ldd hello
not a dynamic executable
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
Bu Dockerfile ile bir imaj inşaa edelim.
docker build --tag hello .
Şimdi de docker imajını çalıştıralım.
docker run hello
Merhaba, dünya!
Ö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)