Команда exec
говорит Баш, чтобы сделать то же самое, проделанную execve()
- для системного вызова заменить свою собственную запись в таблице процессов с программой запущенной ,
По своей природе эта операция означает, что сценарий больше не работает при завершении. Если вы этого не хотите, просто достаньте префиксы exec
.
(Кроме того, нет абсолютно никаких оснований для использования здесь wait
; wait
имеет какой-либо эффект независимо от того, связан ли процесс с фоном, и вы ничего не используете).
Тем не менее, вы можете рассмотреть возможность использования подоболочки размаха в cd
операций - а затем exec
заменят только процесс подоболочки, а не родители; это не является строго необходимым, даже в этом случае, но это небольшая оптимизация производительности (то же самое, заменив #!/bin/bash
с #!/bin/sh
является повышение производительности на платформах, обеспечивающих легкий /bin/sh
, так как вы не используете Баш-только функция):
#!/bin/sh
(cd dockerfiles/nginx && exec docker build -t nginx .)
(cd dockerfiles/percona && exec docker build -t percona .)
(cd dockerfiles/memcache && exec docker build -t memcache .)
(cd dockerfiles/sphinx && exec docker build -t sphinx .)
(cd dockerfiles && exec docker build -t php .)
docker-compose up
Вы можете увидеть внесенные изменения, которые позволят вам избавиться от беспорядка 'cd ..' (и фактически _do_ сделать выгодное использование' exec', хотя и в качестве полностью дополнительного повышения производительности). –
Я вижу ваши изменения и изменил свой сценарий в соответствии с ними. Это намного лучше, чем у меня. Спасибо за помощь. – Johnathon22
Также обратите внимание, что это можно упростить с помощью цикла: 'for f в nginx percona memcache sphinx; do (cd dockerfiles/$ f && exec docker build -t $ f.); done' Это облегчает для читателя, чтобы он мог видеть сходства в командах. –