2015-05-01 23 views
6

Sto cercando di capire come funziona l'opzione COMMAND nella finestra mobile. Nel mio attuale docker-compose.yml avvio l'immagine mobile dock prosody (https://github.com/prosody/prosody-docker) e voglio creare un elenco di utenti quando il container è effettivamente avviato.Docker Comporre ed eseguire il comando sul contenitore di partenza

La documentazione del contenitore indica che un utente può essere creato utilizzando le opzioni ambientali LOCAL, DOMAIN, and PASSWORD, ma questo è un utente singolo. Ho bisogno di un elenco di utenti.

Durante la lettura di alcune cose in Internet sembrava che utilizzando l'opzione di comando dovrei essere in grado di eseguire comandi in un contenitore di partenza o in esecuzione.

xmpp: 
    image: prosody/prosody 
    command: prosodyctl register testuser localhost testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Ma questo sembra non funzionare, ho controllato alla corsa contenitore utilizzando docker exec -it <imageid> bash ma l'utente non viene creato.

È possibile eseguire un comando su un container avviato tramite docker-compose o ci sono altre opzioni?

+0

L'opzione comando sovrascrive il comando predefinito dal contenitore finestra mobile in modo che non possa essere utilizzato per ciò che si desidera. Forse puoi creare uno script che per prima cosa avvii il tuo ambiente usando 'docker-compose start 'e poi usa' docker exec prosodyctl register ... 'per creare utenti in quel contenitore? – Eelco

risposta

1

L'istruzione COMMAND è esattamente lo stesso che viene passato alla fine di un comando docker run, ad esempio echo "hello world" in:

docker run debian echo "hello world" 

Il comando viene interpretato come argomenti alla ENTRYPOINT dell'immagine, che a sua Il caso di Debian è /bin/bash. Nel caso dell'immagine, viene passato a this script. Guardando quello script, il tuo comando sarà appena passato alla shell. Mi sarei aspettato che ogni comando che avessi eseguito fosse eseguito correttamente, ma il contenitore uscirà una volta completato il comando. Notare che il comando predefinito è impostato nel Dockerfile su CMD ["prosodyctl", "start"] che è presumibilmente un processo di lunga durata che avvia il server.

Non sono sicuro di come funziona Prosody (o anche di cosa si tratta), ma penso che probabilmente vorrai mappare in un file di configurazione che trattiene gli utenti o configurare un contenitore di dati per mantenere la configurazione. La prima soluzione significherebbe l'aggiunta di qualcosa di simile:

volumes: 
    - my_prosodoy_config:/etc/prosody 

Per il file finestra mobile-composizione, dove my_prosody_config è una directory contenente i file di configurazione.

La seconda soluzione potrebbe coinvolgere prima la creazione di un contenitore di dati come:.

docker run -v /etc/prosody -v /var/log/prosody --name prosody-data prosody-docker echo "Prosody Data Container" 

(L'eco deve completare, lasciando con un contenitore fermato che ha volumi impostati per la configurazione e tronchi solo assicurarsi di non docker rm questo contenitore per caso)

Poi nella finestra mobile-composizione file del componente aggiuntivo:

volumes_from: 
    - prosody-data 

Si spera che sia possibile aggiungere utenti eseguendo docker exec come in precedenza, quindi eseguendo prosodyctl register nella riga di comando. Ma questo dipende da come si comportano la prosodia e l'immagine.

1

CMD è direttamente correlato a ENTRYPOINT in Docker (vedere la domanda this per una spiegazione). Quindi, cambiando uno di questi, devi anche controllare come questo influisce sull'altro.Se si guarda il numero Dockerfile, si vedrà che il comando predefinito è quello di avviare prosodia attraverso CMD ["prosodyctl", "start"]. entrypoint.sh passa semplicemente questo comando attraverso come Adrian menzionato. Tuttavia, il tuo comando sovrascrive il comando predefinito, quindi il tuo demone prosody non viene mai avviato. Forse vuoi provare qualcosa come

xmpp: 
    image: prosody/prosody 
    command: sh -c prosodyctl register testuser localhost testpassword && prosodyctl start 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

invece. Più elegante e in qualche modo ciò che il creatore sembra essere destinato (a giudicare dallo script entrypoint.sh) sarebbe qualcosa di simile

xmpp: 
    image: prosody/prosody 
    environment: 
     - LOCAL=testuser 
     - DOMAIN=localhost 
     - PASSWORD=testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Per rispondere alla tua domanda finale: no, non è possibile (a partire da ora) per eseguire comandi su un container in esecuzione tramite docker-compose. Tuttavia, si può facilmente farlo con finestra mobile:

docker exec -i prosody_container_name prosodyctl register testuser localhost testpassword 

dove prosody_container_name è il nome del vostro contenitore in esecuzione (uso docker ps alla lista contenitori in esecuzione).

Problemi correlati