Wewnątrz moich Dockerfiles chciałbym SKOPIOWAĆ plik do mojego obrazu, jeśli istnieje, plik Require.txt dla pip wydaje się być dobrym kandydatem, ale jak można to osiągnąć?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
lub
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
docker
dockerfile
derrend
źródło
źródło
Odpowiedzi:
Nie jest to obecnie obsługiwane (jak podejrzewam, że prowadziłoby to do niemożliwego do odtworzenia obrazu, ponieważ ten sam plik Dockerfile skopiowałby plik lub nie, w zależności od jego istnienia).
Jest to nadal wymagane w numerze 13045 , przy użyciu symboli wieloznacznych: „
COPY foo/* bar/" not work if no file in foo
” (maj 2015).Na razie nie zostanie zaimplementowany (lipiec 2015 r.) W Dockerze, ale inne narzędzie do kompilacji, takie jak bocker, może to obsługiwać.
źródło
dev
działa z serwerem deweloperskim webpack , a jego odpowiednikprod
działa z/dist
folderem statycznym? Dzieje się tak w większości dzisiejszych konfiguracji front-end i oczywiściedev
iprod
nie może być tutaj to samo. Jak więc sobie z tym poradzić?Oto proste obejście:
Upewnij się, że
foo
istnieje, ponieważCOPY
wymaga co najmniej jednego prawidłowego źródła.Jeśli
file-which-may-exist
jest obecny, zostanie również skopiowany.UWAGA: Powinieneś uważać, aby twój symbol wieloznaczny nie odbierał innych plików, których nie zamierzasz kopiować. Aby być bardziej ostrożnym, możesz użyć
file-which-may-exist?
zamiast tego (?
dopasowuje tylko jeden znak).Lub jeszcze lepiej, użyj takiej klasy znaków, aby upewnić się, że dopasowany zostanie tylko jeden plik:
źródło
COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/
RUN mv /tmp/docker/docker /usr/bin/docker
RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true
(gdzie współdzielona biblioteka jest nieznaną jednostką.)Jak stwierdzono w tym komentarzu , odpowiedź Santhosha Hirekerura nadal kopiuje plik, aby zarchiwizować prawdziwą kopię warunkową, możesz użyć tej metody.
Te
ONBUILD
instrukcje gwarantuje, że plik jest kopiowany tylko wtedy, gdy „oddział” został wybrany przezBUILD_ENV
. Ustaw tę zmienną za pomocą małego skryptu przed wywołaniemdocker build
źródło
Obejdź rozwiązanie
Miałem wymóg skopiowania FOLDERU na serwer w oparciu o zmienne ENV. Zrobiłem pusty obraz serwera. utworzył wymaganą strukturę folderów wdrożeniowych w folderze lokalnym. następnie dodano poniższy wiersz do DockerFile, skopiuj folder do kontenera. W ostatnim wierszu dodano punkt wejścia do uruchomienia pliku init.sh przed dockerem uruchomieniem serwera.
Następnie utwórz plik custom-init.sh lokalnie ze skryptem podobnym do poniższego
W pliku docker-compose poniżej linii.
środowisko: - BUILD_EVN = TEST
Te zmiany kopiują folder do kontenera podczas kompilacji platformy Docker. kiedy wykonujemy docker-compose up , skopiuj lub wdrożysz właściwy folder na serwerze przed jego uruchomieniem.
źródło
Skopiuj wszystkie pliki do jednorazowego katalogu, ręcznie wybierz ten, który chcesz, a resztę odrzuć.
Możesz osiągnąć coś podobnego za pomocą etapów kompilacji, które polegają na tym samym rozwiązaniu, używając
cp
do warunkowego kopiowania. Korzystając z etapu kompilacji, ostateczny obraz nie będzie zawierał całej zawartości początkowejCOPY
.źródło
cache
i w zależności od tego, co to cache wybieram, co robić w plikach skryptów!Wypróbowałem inne pomysły, ale żaden nie spełnił naszych wymagań. Pomysł polega na utworzeniu podstawowego obrazu nginx dla podrzędnych statycznych aplikacji internetowych. Ze względów bezpieczeństwa, optymalizacji i standaryzacji obraz podstawowy musi umożliwiać
RUN
polecenia dotyczące katalogów dodanych przez obrazy potomne. Obraz podstawowy nie kontroluje, które katalogi są dodawane przez obrazy podrzędne. Zakłada się, że obrazy potomne będąCOPY
znajdowały się gdzieś podCOMMON_DEST_ROOT
.To podejście to hack, ale idea jest taka, że obraz podstawowy będzie obsługiwał
COPY
instrukcje dla katalogów od 1 do N dodanych przez obraz potomny.ARG PLACEHOLDER_FILE
iENV UNPROVIDED_DEST
są wykorzystywane w celu zaspokojenia<src>
i<dest>
wymagania dla każdejCOPY
nie potrzeba instrukcji.To rozwiązanie ma oczywiste wady, takie jak fikcyjna
PLACEHOLDER_FILE
i zakodowana na stałe liczba obsługiwanych instrukcji COPY. Nie ma również sposobu na pozbycie się zmiennych ENV, które są używane w instrukcji COPY.źródło