Come funziona il lettore di interpretazione CMD?

Iniziale Attemtp

Ho un Dockerfile nel mio progetto di binari, che termina con:

CMD ["bundle", "exec", "unicorn", "-D", "-c /usr/src/app/config/unicorn.rb"] 

Quando eseguo un contenitore, ottengo:

 /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:75:in `read': No such file or directory @ rb_sysopen - /usr/src/app/config/unicorn.rb (Errno::ENOENT) from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:75:in `reload' from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/lib/unicorn/configurator.rb:68:in `initialize' from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in `new' from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:100:in `initialize' from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/bin/unicorn:126:in `new' from /usr/local/lib/ruby/gems/2.1.0/gems/unicorn-4.8.3/bin/unicorn:126:in `<top (required)>' from /usr/local/bin/unicorn:23:in `load' from /usr/local/bin/unicorn:23:in `<main>' master failed to start, check stderr log for details 

Quello che non capisco, perché quando cambio la CMD a CMD ["cat", "config/unicorn.rb"] , l' docker run <image> CMD ["cat", "config/unicorn.rb"] docker run <image> correttamente il file .

CMD come shell

Dopo alcuni tentativi e errori ho scoperto che:

 CMD bundle exec unicorn -D -c /usr/src/app/config/unicorn.rb 

funziona bene .

Corretto tentativo

Dopo aver consultato i documenti Docker, ho visto che quando si utilizza il formato CMD ["executable","param1","param2"] è necessario dare il path completo all'eseguibile. Questo non ho fatto nel mio tentativo iniziale.

Sono andato su un cambio CMD a:

 CMD ["/usr/local/bin/bundle", "exec", "unicorn", "-D", "-c /usr/src/app/config/unicorn.rb"] 

che ha funzionato !

Domanda

Quello che mi confonde è che nel primo tentativo di bundle exec unicorn , ma semplicemente non ha trovato il file di configuration.

Qualcuno può esalare questo comportmento? Perché il mio attivo inizia, ma non trova il file e le altre due versioni funzionano bene?

Modifica

Per chiunque voglia riprodurlo. Ecco il Dockerfile:

 FROM benjaminbauer/ruby:latest ONBUILD EXPOSE 8080 CMD ["/usr/local/bin/bundle", "exec", "unicorn", "-D", "-c /usr/src/app/config/unicorn.rb"] 

Il benjaminbauer/ruby è solo una forchetta dell'image ruby ufficiale con l' installazione del bundle memorizzato in cache . Utilizzare il branch cache_bundle_install se si desidera costruirlo.