Yeni görüntülerden kapsayıcıları her zaman yeniden oluşturmak için docker-compose nasıl edinilir?


200

Docker görüntülerim bir Jenkins CI sunucusu üzerine kuruludur ve özel Docker Kayıt Defterine gönderilir. Amacım, her zaman görüntülerin orijinal yapım durumunu başlatan docker-compose ortamları sağlamaktır.

Şu anda farklı makinelerde docker-compose 1.3.2 ve 1.4.0 kullanıyorum, ancak daha önce eski sürümleri de kullandık.

Her zaman docker-compose pull && docker-compose up -dyeni görüntüleri kayıt defterinden almak ve başlatmak için komutları kullandım . Tercih ettiğim davranışın belirli bir zamana kadar beklendiği gibi çalıştığına inanıyorum, ancak o zamandan beri docker-compose uporijinal olarak oluşturulan görüntüleri her seferinde başlatmak yerine daha önce durdurulmuş kapları yeniden çalıştırmaya başladı.

Bu davranıştan kurtulmanın bir yolu var mı? Bu şekilde docker-compose.yml yapılandırma dosyasında her çağrı üzerine komut satırında bir şey "unutma" bağımlı olmayacak şekilde bağlanmış olabilir mi?

ps. Hedefime ulaşmak için bir yol bulmanın yanı sıra, bu davranışın arka planı hakkında biraz daha fazla bilgi edinmek isterim. Docker'ın temel fikri değişmez bir altyapı inşa etmek olduğunu düşünüyorum. Docker-compose'un şu anki davranışı bu yaklaşımla çatışıyor gibi görünüyor ya da burada bazı noktaları kaçırıyor muyum?

Yanıtlar:


234

docker-compose up --force-recreatebir seçenektir, ancak CI için kullanıyorsanız docker-compose rm -f, kapları ve hacimleri durdurmak ve kaldırmak için derlemeye başlayacağım (sonra çekin ve yukarı doğru takip edin).

Ne kullanıyorum:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

Kapların yeniden oluşturulmasının nedeni, kullanılabilecek veri hacimlerini korumaktır (ve ayrıca upçok daha hızlı hale gelir ).

CI yapıyorsanız bunu istemezsiniz, bu yüzden her şeyi kaldırmak istediğinizi elde etmenizi sağlar.

Güncelleme: 1.7'de up --buildeklenen kullanımdocker-compose


1
Evet, aslında CI'de de bunu yapıyorum. Neden bahsetmediğimden emin değilim ...
Adrian Mouat

@dnephin docker-compose run -dmevcut değil mi? docker-compose up -dHayır mı demek istiyorsun ?
Guillaume Vincent

2
koşarsan docker-compose pullönce docker-compose rm -fhatta daha fazla zaman kazandırabilir
stephanlindauer

2
Sondaki -d bayrağı ne işe yarar?
David J. Davis

3
"-d Müstakil mod: Kapsayıcıları arka planda çalıştır"
dnephin

137

Benim için çalışan tek çözüm bu komuttu:

docker-compose build --no-cache

Bu, otomatik olarak repodan yeni bir resim çeker ve önceden kullandığınız parametrelerle önceden oluşturulmuş önbellek sürümünü kullanmaz.


1
Ayrıca, Windows 10 altında DNS sunucusunu Otomatik'ten Sabit'e veya Sabit'ten Otomatik'e ayarlarda ayarlamak yardımcı olabilir.
qräbnö

2
Docker-comopse sürüm 2 ile OS X binasında benim için çalıştı
RoboBear

1
OS X docker üzerinde çalıştı.
MerhabaDünya

56

Mevcut resmi belgelere göre, önceden durdurulmuş veya kısmen kaldırılmışsa vb.

docker-compose down

Ardından resimlerinizde yeni değişiklikleriniz varsa veya Dockerfiles şunları kullanır:

docker-compose build --no-cache

En sonunda:docker-compose up

Bir komutta: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheyalnızca Dockerfiles dosyalarında değişiklik varsa gereklidir.
Victor Timoftii

Gerçekten, Victor. Teşekkürler! Ben de konteyner başlatıldığında yürütülen bir modül / uygulama güncelledikten sonra gerekli olduğunu düşündüm. Bu durumlar için, çalıştırmadan önce docker-compose up, hizmetleri yeniden oluşturmak gerekir docker-compose build.
ivanleoncz

18

Sen geçebilir --force-recreateiçin docker compose uptaze kaplar kullanılmalıdır hangi.

Kapları yeniden kullanmanın ardındaki mantığın, geliştirme sırasındaki değişiklikleri korumak olduğunu düşünüyorum. Compose'un, konteyner rekreasyonu arasında da devam edecek olan birimlere benzer bir şey yaptığını unutmayın (yeniden oluşturulan bir konteyner, selefinin hacimlerine eklenecektir). Bu, örneğin, önbellek olarak kullanılan bir Redis kabınız varsa ve her küçük değişiklik yaptığınızda önbelleği kaybetmek istemiyorsanız yardımcı olabilir. Diğer zamanlarda sadece kafa karıştırıcı.

Bu dosyayı Compose dosyasından zorlamanın herhangi bir yolu olduğuna inanmıyorum.

Muhtemelen değişmez altyapı ilkeleriyle çatışıyor. Karşı argüman muhtemelen Compose'u üretimde (henüz) kullanmamanızdır. Ayrıca, kesinlikle iyi bir kullanım durumu / satış noktası olmasına rağmen, değişmez infra'nın Docker'ın temel fikri olduğunu kabul ettiğimden emin değilim.


Cevap için teşekkürler. Bunu yapılandırma düzeyinde zorlamak için gerçekten yararlı olacağını düşünüyorum, örn. bir veritabanı kapsayıcı için zorlamak ve uygulama kapsayıcılar için varsayılan olarak rekreasyon devre dışı bırakmak için ..
Kristof Jozsa

8
--force-recreatebenim için çalışmıyor ... Yeni bir sürüm dışarıda olmasına rağmen görüntü
çekilmiyor

1
@lisak Hiç yeni görüntüler çekti demedim. Öyle değil. Sadece yerel olarak mevcut olan herhangi bir görüntüyü kullanarak yeni kaplar başlatır. Docker pull'ı manuel olarak çalıştırmanız gerekir.
Adrian Mouat

3
docker-compose up --build

VEYA

docker-compose build --no-cache

1
Mümkünse, yalnızca kod yerine ek açıklama sağlamaya çalışın. Bu tür cevaplar, topluluk üyelerine ve özellikle yeni geliştiricilerin çözümün nedenini daha iyi anlamalarına yardımcı olduklarından ve takip sorularının ele alınmasının önlenmesine yardımcı olabildiklerinden daha yararlı olma eğilimindedir.
Rajan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.