Kafayı yemek üzereyim arkadaşlar. Şaka gibi bir durum. Günlerdir üzerinde uğraştığım, Selenium ve BeautifulSoup karışımı bir scraping botunu nihayet Docker konteynerına soktum. Local'de (kendi makinemde) mükemmel çalışıyor. "Tamam, artık production'a atabilirim" diyip bir Ubuntu sunucusuna gönderdim. Ve bam! Konteyner ayağa kalkar kalkmaz, basit bir config.json dosyasını bile bulamadığı için "FileNotFoundError" diye ağlamaya başladı.
"Ama Local'de Çalışıyordu!" İsyanı
İlk tepkim buydu tabii. Docker'ın bütün amacı bu değil miydi? "Benim makinede çalışıyorsa, her yerde çalışır" vaadi. Meğerse öyle değilmiş. Hemen docker logs ile konteynerın içine baktım. Hata, botun ilk açılışta okuması gereken bir dosyayı bulamamasından kaynaklanıyordu.
Kod bu kadar basit. Peki sorun ne?
Sorunun Kökü: Göreceli Yollar (Relative Paths) ve Çalışma Dizini
Uzun bir debug seansından sonra olayı çözdüm. Local'de Dockerfile'ımın olduğu dizinden build alıyordum ve tüm dosyalar oradaydı. Botum, çalışma dizini (WORKDIR) içindeki dosyalara erişiyordu. Sunucuda ise farklı bir dizinden build almıştım veya konteynerın içindeki WORKDIR beklediğim gibi ayarlanmamıştı. Dosya orada olsa bile, bot onu göremiyordu.
StackOverflow'da bile tam bu duruma uyan bir çözüm bulamadım. Herkes "volume bağla" diyordu ama benim ihtiyacım o değildi. Dosya, image'ın içinde olmalıydı.
Çözüm: Mutlak Yollar & Dockerfile Düzenlemesi
İki şey yaptım:
1. Önce, Dockerfile'ımda COPY komutunu ve WORKDIR'i tekrar gözden geçirdim. Tüm gerekli dosyaların doğru dizine kopyalandığından emin oldum.
2. Daha da önemlisi, botumdaki tüm dosya okuma işlemlerini göreceli yoldan (relative path) çıkarıp, konteyner içindeki mutlak bir yola (absolute path) çevirdim. Veya daha iyisi, dosya yolunu bir environment variable'dan almaya başladım.
Bu küçük değişiklikten sonra, sunucudaki konteynerım da local'deki gibi mutlu mesut çalışmaya başladı.
Özetle: Docker "her yerde çalışır" vaadini tutar, ama bizim kodumuzun dosya erişimleri de buna uygun olmalı. Göreceli yollar, özellikle WORKDIR değiştiğinde bizi tuzağa düşürebiliyor.
Siz de benzer bir "local'de çalışıyor, sunucuda çalışmıyor" tuzağına düştünüz mü? Özellikle Docker ve dosya sistemi konusunda başka hangi gizli tuzaklarla karşılaştınız?
İlk tepkim buydu tabii. Docker'ın bütün amacı bu değil miydi? "Benim makinede çalışıyorsa, her yerde çalışır" vaadi. Meğerse öyle değilmiş. Hemen docker logs ile konteynerın içine baktım. Hata, botun ilk açılışta okuması gereken bir dosyayı bulamamasından kaynaklanıyordu.
Python:
with open('config.json', 'r') as f:
config = json.load(f)
Kod bu kadar basit. Peki sorun ne?
Uzun bir debug seansından sonra olayı çözdüm. Local'de Dockerfile'ımın olduğu dizinden build alıyordum ve tüm dosyalar oradaydı. Botum, çalışma dizini (WORKDIR) içindeki dosyalara erişiyordu. Sunucuda ise farklı bir dizinden build almıştım veya konteynerın içindeki WORKDIR beklediğim gibi ayarlanmamıştı. Dosya orada olsa bile, bot onu göremiyordu.
StackOverflow'da bile tam bu duruma uyan bir çözüm bulamadım. Herkes "volume bağla" diyordu ama benim ihtiyacım o değildi. Dosya, image'ın içinde olmalıydı.
İki şey yaptım:
1. Önce, Dockerfile'ımda COPY komutunu ve WORKDIR'i tekrar gözden geçirdim. Tüm gerekli dosyaların doğru dizine kopyalandığından emin oldum.
2. Daha da önemlisi, botumdaki tüm dosya okuma işlemlerini göreceli yoldan (relative path) çıkarıp, konteyner içindeki mutlak bir yola (absolute path) çevirdim. Veya daha iyisi, dosya yolunu bir environment variable'dan almaya başladım.
Python:
import os
config_path = os.path.join(os.getcwd(), 'config.json')
# veya
config_path = os.environ.get('CONFIG_PATH', '/app/config.json')
Bu küçük değişiklikten sonra, sunucudaki konteynerım da local'deki gibi mutlu mesut çalışmaya başladı.
Özetle: Docker "her yerde çalışır" vaadini tutar, ama bizim kodumuzun dosya erişimleri de buna uygun olmalı. Göreceli yollar, özellikle WORKDIR değiştiğinde bizi tuzağa düşürebiliyor.
Siz de benzer bir "local'de çalışıyor, sunucuda çalışmıyor" tuzağına düştünüz mü? Özellikle Docker ve dosya sistemi konusunda başka hangi gizli tuzaklarla karşılaştınız?