2014-07-21 15 views
6

Come parte della strategia di implementazione, sto gestendo i contenitori Docker con Upstart.Crea contenitore mobile dall'immagine senza avviarlo

Per fare questo, ho bisogno di tirare un'immagine da un Registro di sistema e creare un contenitore di nome (come suggerito sul Upstart script to run container won't manage lifecycle)

C'è un modo per creare il contenitore senza prima eseguire l'immagine? Non voglio dover avviare un contenitore (che potrebbe introdurre effetti collaterali), interromperlo e quindi gestirlo altrove.

Per esempio, qualcosa come:

docker.io create -e ENV1=a -e ENV2=b -p 80:80 --name my_first_container sample/containe 

risposta

3

È possibile ottenere che utilizzando Docker Remote API.

Prima di tutto regola come viene eseguito il daemon docker. Configurarlo per ascoltare le richieste HTTP sulla porta 4243, oltre alla presa di UNIX di default:

sudo sh -c "echo 'DOCKER_OPTS=\"-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock\"' > /etc/default/docker" 

Ora, è possibile utilizzare il /containers/create endpoint per creare un contenitore senza eseguirlo:

curl -X POST -H "Content-Type: application/json" http://localhost:4243/containers/create?name=my_first_container -d ' 
{ 
    "Name": "dtest2", 
    "AttachStdin": "false", 
    "AttachStdout": "false", 
    "AttachStderr": "false", 
    "Tty": "false", 
    "OpenStdin": "false", 
    "StdinOnce": "false", 
    "Cmd":["/bin/bash", "-c", "echo Starting;sleep 20;echo Stopping"], 
    "Image": "ubuntu", 
    "DisableNetwork": "false" 
} 
' 

Prestare attenzione al parametro ?name=my_first_container aggiunto all'URL della richiesta di ricciolo. Questo è il nome del contenitore.

Nota laterale - Lo stesso può essere ottenuto senza aggiungere l'interfaccia HTTP, tuttavia sembra più semplice mostrare la soluzione utilizzando una semplice richiesta POST di arricciatura.

+0

Preferisco non aggiungere l'interfaccia http per essere leggibile in tutto il mondo (o anche da localhost, per i motivi che la comunità Docker ha già discusso) c'è un comando equivalente con il socket unix? –

+0

@MarshallAnschutz ci sono [modi per proteggere] (http://blog.james-carr.org/2013/10/30/securing-dockers-remote-api/) l'interfaccia http del Docker. Se vuoi interagire direttamente con il socket unix, puoi inviare la richiesta HTTP eseguendo "echo -e" POST/containers/create? Name = dtest8 HTTP/1.1 ....... "| nc -U/var/run/docker.sock' –

+0

Mi sto appoggiando all'interfaccia python per farlo funzionare correttamente. Questo sembra essere il modo più sano per gestirlo –

Problemi correlati