run - docker tag example
Cómo establecer una variable de entorno en un contenedor acoplable en ejecución (6)
Si tengo un contenedor acoplable que comencé hace un tiempo, ¿cuál es la mejor manera de establecer una variable de entorno en ese contenedor en ejecución? Inicialmente establecí una variable de entorno cuando ejecuté el comando de ejecución.
$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress
pero ahora que ha estado funcionando por un tiempo, quiero agregar otro VIRTUAL_HOST
a la variable de entorno. No quiero eliminar el contenedor y luego volver a ejecutarlo con la variable de entorno que quiero porque entonces tendría que migrar los volúmenes viejos al nuevo contenedor, tiene archivos de temas y cargas que no quiere perder.
Me gustaría cambiar el valor de la variable de entorno VIRTUAL_HOST
.
A:
- configurar muchos env vars en un solo paso,
- evite exponerlos en el historial de ''sh'', como con la opción ''-e'' (pasar credenciales / tokens de api),
puedes usar
--env-file key_value_file.txt
opción:
docker run --env-file key_value_file.txt $INSTANCE_ID
Docker no ofrece esta característica.
Existe un problema: " ¿Cómo establecer una variable de entorno en un contenedor existente? # 8838 "
También desde " Permitir que el docker start
a tomar variables de entorno # 7561 ":
En este momento Docker no puede cambiar la configuración del contenedor una vez que se ha creado, y generalmente esto está bien porque es trivial crear un nuevo contenedor.
En general, hay dos opciones, porque Docker no es compatible con esta característica ahora:
Cree su propia secuencia de comandos, que actuará como corredor para su comando. Por ejemplo:
#!/bin/bash export VAR1=VAL1 export VAR2=VAL2 your_cmd
Ejecute su comando de la siguiente manera:
docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd"
En primer lugar, puede establecer env dentro del contenedor de la misma manera que lo hace en un cuadro de Linux.
En segundo lugar, puede hacerlo modificando el archivo de configuración de su contenedor acoplable ( /var/lib/docker/containers/xxxx/config.v2.json
). Tenga en cuenta que necesita reiniciar el servicio del acoplador para que surta efecto. De esta manera, puede cambiar algunas otras cosas como el mapeo de puertos, etc.
Para un caso de uso algo angosto, el número de acoplador 8838 menciona este tipo de ataque :
Solo detiene el daemon de Docker y cambia la configuración del contenedor en /var/lib/docker/containers/[container-id]/config.json (sic)
Esta solución actualiza las variables de entorno sin necesidad de eliminar y volver a ejecutar el contenedor, teniendo que migrar volúmenes y recordar los parámetros para run
.
Sin embargo, esto requiere un reinicio del daemon docker. Y, hasta que se resuelva el problema 2658 , esto incluye un reinicio de todos los contenedores .
Usted escribió que no desea migrar los volúmenes anteriores . Así que asumo que el Dockerfile
que Dockerfile
para construir la imagen spencercooley/wordpress
tiene VOLUME
s definido o que los has especificado en la línea de comando con el -v
.
Simplemente podría iniciar un nuevo contenedor que importe los volúmenes del antiguo con el --volumes-from
como:
$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres
Entonces tendrá un contenedor nuevo pero no perderá los datos anteriores. Ni siquiera necesita tocar o migrarlo .
Un contenedor bien hecho siempre es apátrida . Eso significa que se supone que su proceso debe agregar o modificar solo archivos en volúmenes definidos. Esto se puede verificar con un simple docker diff <containerId>
después de que el contenedor se haya ejecutado durante un tiempo.
En ese caso, no es peligroso cuando vuelve a crear el contenedor con los mismos parámetros (en su caso, los ligeramente modificados). Suponiendo que lo crea exactamente desde la misma imagen a partir de la cual se creó el anterior y vuelve a utilizar los mismos volúmenes con el cambio mencionado anteriormente.
Una vez que el nuevo contenedor se haya iniciado correctamente y haya verificado que todo se ejecuta correctamente, puede eliminar el antiguo contenedor de wordpress. Los volúmenes anteriores se derivan del nuevo contenedor y no se eliminarán.