2016-10-20 10 views
5

biegnę następujące polecenie Uruchom w moim Dockerfile, spodziewa się „Raporty” Spisie być tworzone w ramach każdego z wymienionych podkatalogów:Bash ekspansja klamra nie działa na komendę Dockerfile RUN

RUN mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs 

ale kiedy sprawdź obraz, widzę katalog nazwany dosłownie "{średnica-env, h248-env, http-env, msrp-env, oktap-env, radius-env, sip-env, synchro-env, xcap-env}" under/opt/seagull, zamiast rozwijania nawiasów.

Co mogę zrobić źle?

+1

Nie wiem w taki czy inny sposób, ale czy 'RUN' działa pod bash? –

+0

Okazuje się, że zależy to od tego, czy używasz formularza powłoki, czy formularza exec. Zobacz moją odpowiedź poniżej. –

Odpowiedz

10

Nie używasz rozszerzania nawiasów, ponieważ nie używasz Bash. Jeśli spojrzeć na documentation for the RUN command:

run (postaci powłoki, polecenie jest uruchamiane w powłoce, która domyślnie jest/bin/sh -c na Linux lub CMD/S/C na Windows)

a ponadto:

Uwaga: do użyciu innej powłoki inne niż '/ bin/sh', używa exec postać przechodzącą w żądanej powłoki. Na przykład, RUN [ "/ bin/bash", "C", "echo hello"]

Tak, wystarczy zmienić polecenie, aby skorzystać z formularza exec i jawnie użyć powłoki bash:

RUN [ "/bin/bash", "-c", "mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs" ] 
+0

Dzięki! Nie mogę uwierzyć, że spędziłem 45 minut na tym, próbując różnych technik ucieczki, sprawdzając domyślne ustawienia basha, itp. –

+7

Czekaj, co? Odpowiedziałaś na własne pytanie i dziękujesz sobie za to ...? –

+3

Tak! :) To był wyczerpujący dzień i musiałem podziękować sobie za ostatecznie RTFM. Ponadto, http://stackoverflow.com/help/self-answer –