Если вы используете Docker 1.12 или новее, просто используйте SHELL
!
general:
SHELL ["/bin/bash", "-c"]
для python vituralenv :
SHELL ["/bin/bash", "-c", "source /usr/local/bin/virtualenvwrapper.sh"]
из https://docs.docker.com/engine/reference/builder/#/shell
SHELL ["executable", "parameters"]
Команда SHELL позволяет использовать оболочку по умолчанию, используемую для оболочки команд команд для переопределения. Стандартная оболочка в Linux - это ["/ bin / sh", "-c"], а в Windows - ["cmd", "/ S", "/ C"]. Инструкция SHELL должна быть записана в форме JSON в файле Docker.
Инструкция SHELL особенно полезна в Windows, где есть две обычно используемые и совершенно разные родные оболочки: cmd и powershell, а также альтернативные оболочки включая sh.
Инструкция SHELL может появляться несколько раз. Каждая команда SHELL отменяет все предыдущие инструкции SHELL и влияет на все последующие инструкции. Например:
FROM microsoft/windowsservercore # Executed as cmd /S /C echo default RUN echo default # Executed as cmd /S /C powershell -command Write-Host default RUN powershell -command Write-Host default # Executed as powershell -command Write-Host hello SHELL ["powershell", "-command"] RUN Write-Host hello # Executed as cmd /S /C echo hello SHELL ["cmd", "/S"", "/C"] RUN echo hello
Следующие инструкции могут быть затронуты инструкцией SHELL, когда форма оболочки из них используется в файле Docker: RUN, CMD и ENTRYPOINT.
Следующие пример - общий шаблон, найденный в Windows, который можно оптимизировать с помощью инструкции SHELL:
... RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt" ...
Команда, вызываемая докером, будет:
cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
Это неэффективно для две причины. Во-первых, вызывается ненужный командный процессор cmd.exe (aka shell). Во-вторых, для каждой инструкции RUN в форме оболочки требуется дополнительная команда powershell-command, префиксная команда.
Чтобы сделать это более эффективным, можно использовать один из двух механизмов. Один из них - использовать форму JSON команды RUN, такую как:
... RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""] ...
. Хотя форма JSON недвусмысленная и не использует ненужный cmd.exe, для этого требуется более многословие, цитируя и убегая. Альтернативным механизмом является использование команды SHELL и формы оболочки, что делает более естественным синтаксис для пользователей Windows, особенно в сочетании с директивой анализа парсера:
# escape=` FROM microsoft/nanoserver SHELL ["powershell","-command"] RUN New-Item -ItemType Directory C:\Example ADD Execute-MyCmdlet.ps1 c:\example\ RUN c:\example\Execute-MyCmdlet -sample 'hello world'
Результат:
PS E:\docker\build\shell> docker build -t shell . Sending build context to Docker daemon 4.096 kB Step 1/5 : FROM microsoft/nanoserver ---> 22738ff49c6d Step 2/5 : SHELL powershell -command ---> Running in 6fcdb6855ae2 ---> 6331462d4300 Removing intermediate container 6fcdb6855ae2 Step 3/5 : RUN New-Item -ItemType Directory C:\Example ---> Running in d0eef8386e97 Directory: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 10/28/2016 11:26 AM Example ---> 3f2fbf1395d9 Removing intermediate container d0eef8386e97 Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\ ---> a955b2621c31 Removing intermediate container b825593d39fc Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world' ---> Running in be6d8e63fe75 hello world ---> 8e559e9bf424 Removing intermediate container be6d8e63fe75 Successfully built 8e559e9bf424 PS E:\docker\build\shell>
Инструкция SHELL также может использоваться для изменения способа работы оболочки. Например, используя SHELL cmd / S / C / V: ON | OFF в Windows, можно было бы модифицировать семантику расширения замедленной среды.
Инструкция SHELL может также использоваться в Linux, если требуется чередование оболочки такие как zsh, csh, tcsh и другие.
Функция SHELL была добавлена в Docker 1.12.