2013-12-17 17 views
82

W dokowanym chcę to zrobić:Docker: zmiana polecenia katalog

git clone XYZ 
cd XYZ 
make XYZ 

Jednak ponieważ nie ma polecenia cd, muszę przejść w pełni za każdym torze (marka XYZ/fullpath). Jakieś dobre rozwiązania?

+0

pokrewne: http://stackoverflow.com/questions/17891669/docker-command-fails-during-build-but-succeeds-while-executed-within-running-co – trcarden

+2

jest komenda WORKDIR jest również możliwe obejście problemu – trcarden

+0

To nie jest obejście problemu, zalecane rozwiązanie https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#workdir –

Odpowiedz

54

Możesz uruchomić skrypt lub bardziej złożony parametr RUN. Oto przykład z Dockerfile Pobrałem patrzeć poprzednio:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \ 
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip 

Ze względu na stosowanie „& &”, będzie tylko dostać się do finału „pip install” komenda jeśli wszystkich poprzednich poleceń udało się.

W rzeczywistości, ponieważ każdy RUN tworzy nowy commit & (obecnie) warstwę AUFS, jeśli masz zbyt wiele poleceń w pliku Dockerfile, użyjesz limitów, więc scalisz RUNy (gdy plik jest stabilny) może być bardzo przydatna rzecz do zrobienia.

+6

Jeśli zastanawiasz się, efekt 'cd' trwa tylko dla bieżącej komendy' RUN'. Następny "RUN" rozpocznie się od bieżącego 'WORKDIR'. – Ritchie

234

Aby przejść do innego katalogu, użyj WORKDIR. Wszystkie polecenia RUN, CMD i ENTRYPOINT po WORKDIR będą wykonane z tego katalogu.

RUN git clone XYZ 
WORKDIR "/XYZ" 
RUN make 
+12

Używanie WORKDIR jest również cytowane jako [najlepsza praktyka dokowania] (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#workdir) –

+2

Uważam, że jest to bardziej odpowiednia odpowiedź na pytanie – purpletentacle

Powiązane problemy