EDIT:ho imparato molto su Docker da quando ho pubblicato originariamente questa risposta. "Avvio automatico dei servizi nei contenitori Docker" non è un buon modello di utilizzo per Docker. Utilizza invece qualcosa come fleet, Kubernetes o persino Monit/SystemD/Upstart/Init.d/Cron per avviare automaticamente i servizi che vengono eseguiti all'interno dei container Docker.
RISPOSTA ORIGINALE:Se stai avviando il contenitore con il comando /bin/bash
, allora puoi farlo nel modo descritto qui:https://stackoverflow.com/a/19872810/2971199
Quindi, se inizi il contenitore con docker run -i -t IMAGE /bin/bash
e se vuoi avviare automaticamente apache2 all'avvio del contenitore, modifica /etc/bash.bashrc
nel contenitore e aggiungi /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf
(o qualunque sia il comando di avvio di apache2) a una nuova riga alla fine del file.
Salva le modifiche alla tua immagine e riavviala con docker run -i -t IMAGE /bin/bash
e troverai apache2 in esecuzione quando ti colleghi.
Immagino che non puoi. Quello che puoi fare è creare un'immagine usando un Dockerfile e definire un CMD in esso, che verrà eseguito all'avvio del contenitore. Consulta la documentazione del builder per le nozioni di base (https://docs.docker.com/reference/builder/) e consulta Eseguire automaticamente un servizio in un contenitore docker per informazioni su come mantenere il servizio in esecuzione.
Non è necessario automatizzarlo utilizzando un Dockerfile. Puoi anche creare l'immagine tramite un commit manuale come fai tu ed eseguirla dalla riga di comando. Quindi, fornisci il comando che dovrebbe eseguire (che è esattamente ciò che effettivamente fa Dockerfile CMD). Puoi anche sovrascrivere il Dockerfiles CMD in questo modo:verrà eseguito solo l'ultimo CMD, che è il comando della riga di comando se avvii il contenitore usandone uno. Il docker run -i -t base /bin/bash
di base comando dalla documentazione è un esempio. Se il tuo comando diventa troppo lungo, puoi ovviamente creare uno script di convenienza.
Un'opzione che potresti utilizzare sarebbe quella di utilizzare un gestore di processi come Supervisord per eseguire più processi. Qualcuno ci è riuscito con sshd e mongodb:https://github.com/justone/docker-mongodb