Utworzyłem kilka różnych katalogów na moim komputerze-hoście, próbując poznać Docker tylko po to, aby moje pliki dockerowe były uporządkowane. Mój plik Dockerfile, który właśnie uruchomiłem, wygląda następująco:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
Moje rzeczywiste obroty to tylko 1 GB. Ale kiedy próbuję to zrobić sudo docker build -t="crystal/test" .
, wysyłam kontekst kompilacji do demona Dockera o pojemności 3,5 GB. Czy jest coś jeszcze, czego nie jestem świadomy, gdy nadal tworzysz obrazy Dockera? Czy moja pamięć gromadzi się, gdy tworzę więcej obrazów w innych katalogach na moim komputerze głównym?
.dockerignore
Odpowiedzi:
Klient platformy Docker wysyła cały „kontekst kompilacji” do demona platformy Docker. Ten kontekst budowania (domyślnie) to cały katalog, w którym się
Dockerfile
znajduje (czyli całerpms
drzewo).Możesz skonfigurować
.dockerignore
plik, aby Docker ignorował niektóre pliki. Możesz z tym poeksperymentować.Alternatywnie, możesz przenieść swój
rpms
folder o jeden poziom wyżej niż twójDockerfile
i tylko symboliczne łączetest.rpm
doDockerfile
katalogu.Często będziesz chciał dodać
.git
folder do folderu,.dockerignore
który był przyczyną różnicy 150 MB -> 5 GB dla niektórych użytkowników w komentarzach tutaj.źródło
ADD
polecenie nie podąża za dowiązaniami symbolicznymi podczas kompilacji. Zobacz: github.com/docker/docker/issues/1676tmp
log
do.dockerignore
+ innych niestandardowych.git
folder jest dołączony domyślnie - to zdecydowanie mnie zaskoczyło.Zaktualizuj 2019
Począwszy od wersji Docker 18.06 istnieje możliwość użycia nowego narzędzia do tworzenia obrazów o nazwie Build Kit .
Jest wstępnie dołączony do Dockera, nie trzeba niczego instalować. Jest wstecznie zgodny ze
Dockerfile
składnią, nie trzeba zmieniać rozszerzeniaDockerfile
.Legacy Docker Build vs New Docker BuildKit
Oto przykład budowania obrazu z ogromnym nieużywanym plikiem w katalogu kompilacji:
Starsza kompilacja platformy Docker:
Nowy zestaw Docker BuildKit:
Jedyną zmianą jest
DOCKER_BUILDKIT=1
zmienna środowiskowa, różnica w czasie jest ogromna..dockerignore
PlikNależy pamiętać, że
.dockerignore
plik jest nadal aktualny i przydatny. NiektóreDockerfile
polecenia, takie jakCOPY . .
, nadal będą uwzględniać.dockerignore
zasady. Ale pliki poboczne w katalogu kompilacji (nieDockerfile
przywoływane w ) nie są już kopiowane jako „kontekst kompilacji” przez BuildKit.źródło
=> [internal] load build context => => transferring context: 924.39MB 86.3s
tylko[...]
linie, które powinny pokazywać 4,3 GB przynajmniej przy pierwszym uruchomieniu. Przyznane za drugim razem, nie przenosi kontekstu, czego wszyscy potrzebowaliśmy..dockerignore
sekcję odpowiedzi: BuildKit nie kopiuje już plików pobocznych w katalogu kompilacji (nie ma odniesienia w pliku Dockerfile). Zwykle tak jest, ale twoje doświadczenia mogą się różnić;)Naprawiłem to, przenosząc mój plik Dockerfile i docker-compose.yml do podfolderu i działało świetnie. Najwyraźniej docker wysyła bieżący folder do demona, a mój folder to 9 gigów.
źródło
Jeśli masz
.dockerignore
plik, a kontekst kompilacji jest nadal duży, możesz sprawdzić, co jest wysyłane do kontekstu kompilacji platformy Docker za pomocą programu The Silver Searcher :Zwróć uwagę, że niektóre
**
wzorce mogą nie działać poprawnie.Zobacz ten numer Github, aby uzyskać dodatkowe komentarze: https://github.com/moby/moby/issues/16056
źródło
W moim przypadku było to wtedy, gdy
-f
wykonuję z niewłaściwymi argumentami - bez ścieżki do katalogu, w którym znajduje się plik Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- dobrzedocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- źleźródło
Jeśli chcesz mieć pełną kontrolę nad kontekstem kompilacji, możesz później zbudować kontener całkowicie bez kontekstu i
COPY
odpowiednich danych.Jedynym minusem tego byłoby to, że przy takim podejściu można to zrobić tylko
ADD
rzeczy w pliku docker odwoływać się do zdalnego adresu URL, a nie pliki z lokalnego hosta.Zobacz https://docs.docker.com/engine/reference/commandline/build/#build-with--
źródło
Miałem ten sam problem co FreeStyler. Jednak budowałem z katalogu jeden w górę z mojego kontekstu. Więc argumenty -f były poprawne, kontekst był nieprawidłowy.
Budowanie z katalogu docker-dir było w porządku
Budowanie z dock-dir zmienił się kontekst budowania. Dlatego musiałem zmienić kontekst w poleceniu. Kontekst jest określony przez „.” w powyższym poleceniu.
Nowa komenda z katalogu projektu powinna brzmieć
Kontekst jest tutaj określony przez „./base”
źródło
jeśli tworzysz obraz i otrzymujesz wiadomość wysyłającą kontekst kompilacji do demona Dockera którego skopiowanie zajmuje czas w logu,
następnie dodaj plik .dockerignore . powinien zawierać pliki lub katalog, których nie trzeba kopiować.
źródło
W przypadku
NodeJS Application
Dodaj.dockerignore
plik do katalogu głównego projektu i wewnątrz.dockerignore
pliku dodaj następujące elementyźródło
Podsumowując, co możesz zrobić, jeśli kontekst kompilacji obrazu platformy Docker jest zbyt duży:
źródło