Nigdy nie powinieneś dodawać poświadczeń do kontenera, chyba że możesz rozgłaszać poświadczenia każdemu, kto może pobrać obraz. W szczególności robienie i ADD creds
później RUN rm creds
nie jest bezpieczne, ponieważ plik kredytów pozostaje w ostatecznym obrazie w pośredniej warstwie systemu plików. Każdy, kto ma dostęp do obrazu, może go łatwo wyodrębnić.
Typowe rozwiązanie, które widziałem, gdy potrzebujesz kredytów, aby wyewidencjonować zależności, a takie jest użycie jednego kontenera do zbudowania innego. Oznacza to, że zwykle masz jakieś środowisko kompilacji w kontenerze podstawowym i musisz je wywołać, aby skompilować kontener aplikacji. Zatem prostym rozwiązaniem jest dodanie źródła aplikacji, a następnie RUN
poleceń kompilacji. Jest to niebezpieczne, jeśli potrzebujesz w tym kredytów RUN
. Zamiast tego umieszczasz źródło w katalogu lokalnym, uruchamiasz (tak jak w docker run
) kontener, aby wykonać krok kompilacji z lokalnym katalogiem źródłowym zamontowanym jako wolumin, a referencje są wstrzykiwane lub montowane jako inny wolumin. Po zakończeniu kroku budowania, budujesz ostateczny kontener, po prostu ADD
w lokalnym katalogu źródłowym, który zawiera teraz zbudowane artefakty.
Mam nadzieję, że Docker doda kilka funkcji, aby to wszystko uprościć!
Aktualizacja: wygląda na to, że przyszłą metodą będzie zagnieżdżone kompilacje. W skrócie, plik dockerfile opisywałby pierwszy kontener używany do tworzenia środowiska wykonawczego, a następnie drugą kompilację zagnieżdżonego kontenera, która może złożyć wszystkie elementy w ostateczny kontener. W ten sposób rzeczy czasu kompilacji nie znajdują się w drugim kontenerze. Jest to aplikacja Java, w której potrzebujesz JDK do zbudowania aplikacji, ale tylko JRE do jej uruchomienia. Omawianych jest wiele propozycji, najlepiej zacząć od https://github.com/docker/docker/issues/7115 i skorzystać z niektórych linków do alternatywnych propozycji.