Come filtrare le variables di ambiente del client docker in un command di esecuzione docker?

Supponiamo che sulla mia macchina client docker abbia le seguenti variables di ambiente:

myValA=B DOCKER_CONTAINER_VALUE_C=networksettingD myValE=F DOCKER_CONTAINER_VALUE_G=arbitrarySettingH 

e voglio passare due di questi valori nel mio contenitore Docker in esecuzione. (Quelli contenenti DOCKER_CONTAINER ).

Ora potrei manualmente codificarlo, come questo:

 docker run -e DOCKER_CONTAINER_VALUE_C='networksettingD' -e DOCKER_CONTAINER_VALUE_G='arbitrarySettingH' --name container_name dockerhub_id/image_name 

Ma voglio automatizzare questo process.

Qualcosa di simile a:

 docker run -e ${env | grep "DOCKER_CONTAINER"} ... 

La mia domanda è: Come filtrare le variables di ambiente del client docker in un command di esecuzione docker?

Potresti fare qualcosa di simile:

 set | grep DOCKER_CONTAINER > env_file docker run --env-file env_file ... 

Oppure, se si desidera veramente una singola row di command:

 docker run --env-file <(set | grep DOCKER_CONTAINER) ... 

Il <(...) è la syntax bash per la sostituzione del process. Da bash(1) :

La sostituzione di process è supportta su sisthemes che supportno i tubi denominati (FIFOs) o il metodo / dev / fd di denominazione di file aperti. Ha la forma di <(elenco) o> (elenco). L'elenco dei processi viene eseguito con il suo ingresso o l'output collegato ad un FIFO oa un file in / dev / fd. Il nome di questo file viene passato come argomento al command corrente come risultato dell'espansione.

Qualcosa di semplice come:

 docker run -e $(set | echo $(sed -n "/^DOC.*_CON.*_VAL.*/s/^/-e /p")" ")--name container_name dockerhub_id/image_name 
  • $ () – command eseguito
  • set – list environment variable
  • sed -n – non fare nessuna printing
  • string di corrispondenza ^ DOC. _CON. _VAL. *
  • sostituire "-e" per l'inizio del carattere di linea
  • p – printing le corrispondenze
  • "" – aggiungere spazio tra i risultati

Puoi includere la string completa della partita; Di solito vado solo per la più breve …

Verificato questo funziona.

 env | { sed -n '/DOCKER/s/^/-e /p' ; echo myimage; } | xargs docker run