Docker: Projede birden fazla Docker dosyası


215

Bir projeye ait Docker dosyalarını, veritabanı için bir Dockerfile, uygulama sunucusu için bir vb. Varsa nasıl düzenlersiniz? Kaynakta bir çeşit hiyerarşi yaratıyor musunuz? Büyük bir kurumsal proje sadece bir Dockerfile'dan oluşamaz mı?


15
kabul edilen cevabı değiştirmek isteyebilirsiniz
pomber

3
Artık kullanılmayan `` Kabul Edildi '' özelliğini daha uygun bir cevaba otomatik olarak "dışlamak" ve taşımak için bir seçenek olmalıdır. Böyle bir hamle için uygunluk kriteri 1) diyelim oyların 10: 1 ve 2) oylarında büyük bir fark olabilir. ago ...)
mirekphd

Yanıtlar:


6

Yazar Notu

Bu cevap güncel değil. İncir artık mevcut değil ve yerine Docker oluşturuldu . Kabul edilen cevaplar silinemez ....

Docker Compose proje hiyerarşisinin oluşturulmasını destekler. Bu nedenle, her alt dizinde bir Dockerfile'ı desteklemek artık çok kolay.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

Orijinal cevap

Her bileşen için bir Dockerfile içeren bir dizin oluşturuyorum. Misal:

Kapları oluştururken sadece dizin adını verin ve Docker doğru Docker dosyasını seçecektir.


3
@DuncanJones Kabul edilen bir yanıtı silemezsiniz ... Denendi :-)
Mark O'Connor

286

In (> = 1.8.0) docker yeni sürümlerinde , bunu yapabilirsin

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

Büyük bir tasarruf.

EDIT: raksja'nın yorumu başına sürümleri güncelle

EDIT: @vsevolod yorum: dosyaları vererek VS kodunda sözdizimi vurgulama almak mümkündür. Dockfile uzantısı (yerine ad) örneğin Prod.Dockerfile, Test.Dockerfile vb.


2
hangi yeni sürüm?
raksja

4
Yeni kontrol ettim, github.com/docker/docker/wiki , bu yüzden onun> Docker 1.8.0
raksja

3
Bu işe yarıyor, ancak IDE'm herhangi bir sözdizimi vurgulamıyor, çünkü dosya adını tanımıyor :(
Alexander Mills

3
@AlexanderMills IDE WebStorm, Dockerfile.webçalıştırma yapılandırmasına bile izin vermiyor . Bu yüzden bir sorun yarattım
steampowered

5
docker-compose.ymlÖrneğin, bir dosyada tanımlanan her 'hizmet' için hangi Dockerfile'ın kullanılması gerektiğini nasıl belirlersiniz ?
JoeTidee

127

Ayrı dizinlerde docker-composeve çoklu kullanımDockerfile

Dockerfileİçin Dockerfile.dbveya adını değiştirmeyin,Dockerfile.web IDE'niz tarafından desteklenmeyebilir ve sözdizimi vurgulamayı kaybedersiniz.

As Kingsley Uchnor dedi , birden sahip olabilir Dockerfile, yapı istediğiniz bir şeyi temsil dizine başına bir tane.

dockerHer uygulamayı ve bunların yapılandırmasını tutan bir klasöre sahip olmayı seviyorum . Veritabanı olan bir web uygulaması için örnek bir proje klasörü hiyerarşisi.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml misal:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose komut satırı kullanım örneği:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Dockerfile dosyanızı oluştururken önceki klasörlerden dosyalara ihtiyacınız olması durumunda

Hala yukarıdaki çözüm kullanabilir ve keşfetmenize yerleştirebilirsiniz Dockerfilegibi bir dizinde docker/web/Dockerfile, tek ihtiyacınız yapı ayarlamaktır contextGözlerinde farklı docker-compose.ymlböyle:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

Bu şekilde, bunun gibi şeylere sahip olabilirsiniz:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

ve bunun ./docker/web/Dockerfilegibi:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

İşte tldr docker-compose'den bazı hızlı komutlar . Daha fazla bilgi için resmi belgelere başvurduğunuzdan emin olun .


1
Derleme süresine (fi COPY ../package.json /app/package.json) deps yüklemek için bir paket yöneticisi dosyasını kopyalamanız gerekirse ne olur ? Bu dosya genellikle kök düzeyinde olur ve docker'ın üst öğeye erişimi yasaklanmıştır. Hangi yaklaşımı takip edeceksiniz?
nass600

1
Ben de bu tip bir kısıtlama isabet ettik ve bu özel durum için, ben inşa webprojeyi . (içinde docker-compose.yml: build: .). Bu şekilde, webinşa ederken kök dosyalara erişebilir. Bu ilgili soruyu gördüm: stackoverflow.com/questions/24537340/… ve dockerkomut satırı kullanırken bunun yerine üst dizinden oluşturabiliriz ve bu yanıt docker-compose ile nasıl yapılacağını gösterir: stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
Bu, docker ile değil IDE'nizle ilgili bir sorundur. @Shuo'nun doğru cevabı var.
BentOnCoding

1
İkinci cevap 1 yaşında ancak Docker'ın belgelerinden doğrudan alınmıyor. -fseçeneği iyi, ancak docker-composealt klasörlerle kullanmayı tercih ederim . Bence her iki cevap da geçerli. Çoğu kişi, Dockerfileçoğu IDE'yi kutudan çıkarmak için varsayılan adı korumayı tercih edebilir . İlk cevabı geçersiz kılmıyorum, sadece bir alternatif sunuyorum. IDE'mi phpkullandığımda Dockerfile'mın bir dosya olduğunu düşünmesini sevmiyorum Dockerfile.phpama evet, işe yarıyor. Docker belgelerinde birkaç örnek gördüm; Dockerfile.build, Dockerfile.debugvb.
GabLeRoux

3
Olarak adlandırma example.DockerfileVSCode sözdizimi vurgulama ve simgeleri tutar.
vmassuchetto

8

Intellij'de docker dosyalarının adını * .Dockerfile olarak değiştirdim ve * .Dockerfile dosya türünü docker sözdizimiyle ilişkilendirdim.


1
Bunu denedim ve güzel bir Docker simgesi aldım.
Drumbeg

3

Bir soyutlama katmanı ekleyin, örneğin, bu projedeki gibi bir YAML dosyası https://github.com/larytet/dockerfile-generator gibi

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

Kısa bir Python betiği / markası, yapılandırma dosyasından tüm Docker dosyalarını oluşturabilir.


1

Birden fazla docker dosyası kullanılmasını gerektiren bir proje üzerinde çalışırken, her docker dosyasını ayrı bir dizinde oluşturun. Örneğin,

app / db /

Yukarıdaki dizinlerin her biri dockerfile dosyalarını içerecektir. Bir uygulama oluşturulurken, docker tüm dizinleri arar ve tüm docker dosyalarını oluşturur.

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.