Jaka jest różnica między docker-compose build
i docker build
?
Załóżmy, że w zadokowanej ścieżce projektu znajduje się docker-compose.yml
plik:
docker-compose build
I
docker build
źródło
Jaka jest różnica między docker-compose build
i docker build
?
Załóżmy, że w zadokowanej ścieżce projektu znajduje się docker-compose.yml
plik:
docker-compose build
I
docker build
docker-compose
można uznać za wrapper wokół CLI dockera (w rzeczywistości jest to kolejna implementacja w Pythonie, jak wspomniano w komentarzach ), aby zaoszczędzić czas i uniknąć linii o długości 500 znaków (a także uruchomić wiele kontenerów w tym samym czasie). Używa pliku o nazwie docker-compose.yml
w celu pobrania parametrów.
Informacje na temat formatu pliku docker-compose można znaleźć tutaj .
Więc w zasadzie docker-compose build
przeczytam twoje docker-compose.yml
, poszuka wszystkich usług zawierających build:
instrukcję i uruchomi docker build
dla każdego z nich.
Każdybuild:
może określić Dockerfile
, kontekst i argumenty do przekazania do docker.
Na zakończenie przykładowym docker-compose.yml
plikiem:
version: '3.2'
services:
database:
image: mariadb
restart: always
volumes:
- ./.data/sql:/var/lib/mysql
web:
build:
dockerfile: Dockerfile-alpine
context: ./web
ports:
- 8099:80
depends_on:
- database
Podczas wywoływania docker-compose build
tylko web
cel będzie potrzebował zbudowania obrazu. docker build
Komenda będzie wyglądać następująco:
docker build -t web_myproject -f Dockerfile-alpine ./web
web
pochodzi od nazwy kontenera.myproject
to nazwa folderu, w którym się znajdujesz. Pozwala to uniknąć konfliktów, jeśli pracujesz nad dwoma projektami, z których oba zawierająweb
kontener.docker-compose.yml
powyższegoweb
pochodzi od nazwy usługi.docker-compose build
zbuduje usługi wdocker-compose.yml
pliku.https://docs.docker.com/compose/reference/build/
docker build
zbuduje obraz zdefiniowany przez Dockerfile.https://docs.docker.com/engine/reference/commandline/build/
źródło
Zasadniczo docker-compose jest lepszym sposobem korzystania z docker niż tylko polecenie docker.
Jeśli pytanie brzmi, czy polecenie kompilacji docker-compose zbuduje coś w rodzaju zip zawierającego wiele obrazów, które w przeciwnym razie zostałyby zbudowane osobno za pomocą zwykłego pliku Dockerfile, to myślenie jest błędne.
Kompilacja Docker-compose, utworzy indywidualne obrazy, przechodząc do indywidualnego wpisu usługi w docker-compose.yml.
Dzięki obrazom docker, command, możemy również zobaczyć wszystkie zapisywane pojedyncze obrazy.
Prawdziwą magią jest docker-compose up.
Ten w zasadzie stworzy sieć połączonych ze sobą kontenerów, które mogą rozmawiać ze sobą o nazwie kontenera podobnej do nazwy hosta.
źródło
Dodawanie do pierwszej odpowiedzi ...
Możesz podać nazwę obrazu i nazwę kontenera w definicji usługi.
np. dla usługi o nazwie „web” w poniższym przykładzie docker-compose, możesz jawnie podać nazwę obrazu i kontenera, aby docker nie musiał używać ustawień domyślnych.
W przeciwnym razie nazwa obrazu, której będzie używał docker, będzie połączeniem folderu (katalogu) i nazwy usługi. np. myprojectdir_web
Dlatego lepiej jest jawnie podać żądaną nazwę obrazu, która zostanie wygenerowana po wykonaniu polecenia docker build.
np. obraz: mywebserviceImage nazwa_kontenera: my-webServiceImage-Container
przykładowy plik docker-compose.yml:
źródło
build:
wymusza podanie dokładnej nazwy pliku w formacieDockerfile
. Na przykład wbuild: ./web
.Więc użyciecontext:
jest dobre!Kilka dodatkowych słów o różnicy między
docker build
adocker-compose build
. Oba mają opcję tworzenia obrazów przy użyciu istniejącego obrazu jako pamięci podręcznej warstw.docker build
opcją jest--cache-from <image>
docker-composer
,cache_from
wbuild
sekcji znajduje się tag .Niestety, do tej pory na tym poziomie obrazy wykonane przez jeden nie są zgodne z drugim jako pamięć podręczna warstw ( identyfikatory nie są kompatybilne ). Jednak
docker-compose
wersja 1.25.0 (2018-11-18) wprowadza eksperymentalną funkcję COMPOSE_DOCKER_CLI_BUILD , któradocker-compose
wykorzystuje natywny kreator docker (w związku z tym obrazy utworzone przezdocker build
mogą być używane jako pamięć podręczna warstw dladocker-compose build
)źródło