2015-10-22 2 views
3

Есть ли способ выполнить команду в качестве аргумента в файле Dockerfile ENTRYPOINT? Я создаю изображение, которое должно автоматически запускать mpirun для количества процессоров, то есть mpirun -np $(nproc) или mpirun -np $(getconf _NPROCESSORS_ONLN).Команды в Docker ENTRYPOINT

Следующая строка работает:

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "4"] # works 

Но я не могу получить адаптивные формы работы:

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(nproc)"] # doesn't work 
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(getconf _NPROCESSORS_ONLN)"] # doesn't work 

Использование `nproc` обратные одиночные кавычки обозначения не работает. Я также не могу передать переменную среды в команду.

ENV processors 4 
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$processors"] # doesn't work 

Кому-нибудь удалось получить такой рабочий процесс?

+0

Возможно, вы захотите создать сценарий оболочки и начать это. Вы можете использовать переменные ENV для управления вашим сценарием оболочки. –

ответ

7

Те, скорее всего, не будет работать: см issue 4783

ENTRYPOINT и CMD особенные, так как они начала без оболочки (так что вы можете выбрать свой собственный) и IIRC они убежали тоже.

В отличие от формы оболочки форма exec не вызывает командную оболочку.
Это означает, что нормальной обработки оболочки не происходит.

Например, ENTRYPOINT [ "echo", "$HOME" ] не будет делать замену переменных на $HOME.
Если вы хотите обработать оболочку, то либо используйте форму оболочки, либо выполните непосредственно оболочку, например: ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ].

Обходным решением было бы использовать скрипт.

COPY docker-entrypoint.sh/
ENTRYPOINT ["/docker-entrypoint.sh"] 

Этот скрипт, когда запускается запуск докера, должен, по крайней мере, извлекать выгоду из переменной окружения.

См. Например, Dockerfile of vromero/activemq-artemis-docker, в котором выполняется сценарий docker-entrypoint.sh.
Для того чтобы CMD бежать, а, сценарии заканчиваются:

exec "[email protected]" 

(Это будет выполняться независимо от того параметра приходит после, либо из CMD директивы, или от docker run параметров)


OP Gilly добавляет in the comments:

Я использую в Dockerfile:

COPY docker-entrypoint.sh 
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"] 

И в сценарии Entrypoint:

#!/bin/bash 
exec mpirun -np $(nproc) "[email protected]" 
+0

Да, это работает. Для любого, кто следит, я использую в Dockerfile: 'COPY docker-entrypoint.sh /' ' Entrypoint [ "/ TiNi", "-", "/docker-entrypoint.sh"]' И в сценарии точки входа: '#!/bin/bash' ' exec mpirun -np $ (nproc) $ @ ' – Gilly

+1

@Gilly Отлично! Я включил ваш комментарий в ответ для большей наглядности. – VonC

+0

Добавлено [цитаты для «$ @»] (https://stackoverflow.com/questions/42298177/docker-container-with-entrypoint-variable-expansion-and-cmd-parameters#comment71978397_42332740) в ответе. – hlovdal

2

Это происходит потому, что вы используете EXEC форму для точки входа и подстановки переменных не будет происходить в ехес форме.

Это ехес форма:

ENTRYPOINT ["executable", "param1", "param2"]

это форма оболочки:

ENTRYPOINT command param1 param2

Из официальной документации:

В отличие от формы оболочки, форма exec не вызывает командную оболочку , Это означает, что нормальной обработки оболочки не происходит. Например, ENTRYPOINT ["echo", "$ HOME"] не будет делать замену переменных на $ HOME

+0

Это может работать для переменных среды, но, похоже, не работает для меня, выполняя подкоманду. – Gilly

Смежные вопросы