Bölüm:10 Linux Shell ve Dockerfile talimatları
komut1 ; komut2 → Linux dünyasında ; işareti komutları sırayla soldan sağa işlemek içindir.
komut1 && komut2 → && işareti Linux dünyasında komutları soldan sağa işlemek içindir. Fakat farklı olarak komut1 başarılı hata vermeden çalışırsa komut2 çalışır.
komut1 || komut2 → ||işareti Linux dünyasında, örnekle komut1 başarılı çalışırsa komut2'yi çalıştırma, komut1 başarısız olursa hata döndürürse komut2'yi çalıştır demektir.
./test.sh & → Script,servis ve ya benzeri işlemlerin uzun sürdüğünü düşündüğümüz durumlarda. bu komutun arka planda işlenmesini isteyebiliriz.
Linux dünyasında uzun komutlar yazdığınızı düşünün. çirkin ve anlamsız okuması da bi o kadar zor olacaktır. Linux dünyasında komutları tek seferde düzgün okunaklı yazmak için \ kullanılır. Böylelikle şunu demiş oluruz. Komutum henüz bitmedi fakat bu satırda değil alt satırdan devam et.
sudo apt install gcc git pkg-config meson ninja-build libavcodec-dev libavformat-dev libavutil-dev libsdl2-dev >Öncesisudo apt install gcc git pkg-config meson ninja-build \
libavcodec-dev libavformat-dev libavutil-dev \
libsdl2-dev >Sonrası
Base imajda bulunan talimatların değerleri biz o base imajdan bir imaj yaratırsak bu talimatların değerleri de bizim imajımıza gelir.(inspect komutuyla inceleyip bakabiliriz) ama örneğin, biz imaj oluştururken kullanıcı değişkeni oluşturup base imajda da bu kullanıcı değişkeni varsa bizim belirttiğimiz değer kabul olur. Eğer imajımızda kullanıcı değikeni yoksa ama base imaj da varsa base imaj da bulunan değer imajımıza yansır. geçerli olur.
Aynı değerler varsa, bizim belirttiğimiz değer geçerli olur.
Aynı değerler yoksa, değer sadece base imaj da varsa base imaj da bulunan değer imajımıza yansır.
COPY ve ADD farkları,
COPY <source> <destination>
ADD <source> <destination>
copy ve add talimatlarını imaj içerisine dosya ve ya dizin kopyalamak için kullanırız.
COPY <kaynakdosya-klasör> <hedef>
COPY /source /usr/src/app
ADD talimatı COPY ile aynı işi yapar yani klasör ve dizin kopyalar. Fakat ADD bunun yanında dosya kaynağının URL olmasına da izin verir. Ayrıca ADD ile kaynak olarak bir .tar dosyası belirtilirse bu dosya imaja .tar olarak değil. açılarak kopyalanır.
Örn: ADD https://wordpress.org/latest.tar.gz /tmp
Not: Uzak sunucudan (URL’den) bir dosyayı ADD ile aldığımızda o dosya sıkıştırılmışsa ADD bu dosyayı olduğu gibi atar. Sadece lokal’de bulunan sıkıştırılmış dosyaları açarak imaja kopyalar.
ENTRYPOINT ve CMD farkları,

- Her docker imajında bir CMD ve ya ENTRYPOINT talimatı bulunmalıdır.
- Her iki talimat da ilgili imajdan container yaratıldığı zaman çalıştırılacak uygulamayı belirlememizi sağlar.
- ENTRYPOINT ile girilen komut runtime’da yani container çalıştırılırken değiştirilemez. CMD ile yazılan talimat runtime’da değiştirilebilir.
- ENTRYPOINT ve CMD aynı anda kullanılırsa CMD’de yazılan komut-değer ENTRYPOINT talimatında yazılan değere parametre olarak eklenir.
Örn:
FROM: centos
ENTRYPOINT ["ping"]
CMD ["8.8.8.8"]
Ping’in yanına parametre olarak eklendi, yani talimat şöyle oldu,
ENTRYPOINT [“ping”, “8.8.8.8”]
EXEC ve SHELL form farkı,

exec form > CMD [“java”, “app”]
shell form > CMD java app
- Eğer komut shell formunda girilirse Docker bu imajdan container yaratıldığı zaman bu komutun varsayılan shell’i çalıştırarak onun içerisinde bu komutu girer. Bu nedenle container’da çalışan 1. proccess yani pid1 bu shell proccess’i olur.
- Eğer komut exec formunda girilirse Docker herhangi bir shell çalıştırmaz ve komut direkt proccess olarak çalışır ve container’ın pid1'i o proccess olur.
- Exec formunda çalıştırılan komutlar herhangi bir shell proccess’i çalıştırmadığı için ENV Variable’ların bazı değerlerine erişemezler.(Shell’in kullandığı env varb’ler)
- Eğer ENTRYPOINT ve CMD birlikte kullanılacaksa EXEC form kullanılmalıdır. Shell form kullanıldığında CMD’deki komutlar ENTRYPOINT’e parametre olarak aktarılmaz.
DOCKER CP,
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp [options] container:src_path dest_path > Silinmemiş, sistemde hala var olan container’ın içerisinden verileri kendi host sistemimize çekebiliriz.
örn: docker cp con1:/usr/src/app .
docker cp [options] src_path container:dest_path > Kendi host sistemimizdeki dosya ve dizinleri containerın istediğimiz dizinine gönderebiliriz.
örn: docker cp foo.txt con1:/usr/src/app .