Estoy pensando en usar Docker para construir mis dependencias en un servidor de Integración Continua (CI), para no tener que instalar todos los tiempos de ejecución y bibliotecas en los propios agentes.
Para lograr esto, necesitaría copiar los artefactos de compilación que se construyen dentro del contenedor nuevamente en el host. ¿Es eso posible?
docker
docker-container
file-copying
usuario2668128
fuente
fuente
Respuestas:
Para copiar un archivo de un contenedor al host, puede usar el comando
Aquí hay un ejemplo:
Aquí goofy_roentgen es el nombre del contenedor que obtuve del siguiente comando:
También puede usar (parte de) la ID del contenedor . El siguiente comando es equivalente al primero.
fuente
docker ps -alq
.docker cp ...
docker cp -L
copiar enlaces simbólicosNo necesitas usar
docker run
.Puedes hacerlo con
docker create
.De los documentos :
Entonces, puedes hacer:
Aquí, nunca comienzas el contenedor. Eso me pareció beneficioso.
fuente
-ti
requiere y sebash
requiere?Monta un "volumen" y copia los artefactos allí:
Luego, cuando finaliza la compilación y el contenedor ya no se está ejecutando, ya ha copiado los artefactos de la compilación en el
artifacts
directorio del host.Editar
Advertencia: cuando hace esto, puede encontrarse con problemas con la identificación del usuario de la ventana acoplable que coincide con la identificación del usuario actual. Es decir, los archivos
/artifacts
se mostrarán como propiedad del usuario con el UID del usuario utilizado dentro del contenedor acoplable. Una forma de evitar esto puede ser usar el UID del usuario llamante:fuente
chown
comando para hacer coincidir la identificación del usuario y la identificación del grupo en la máquina host.Monta un volumen, copia los artefactos, ajusta la identificación del propietario y la identificación del grupo:
fuente
TLDR;
Descripción
docker run
con un volumen de host,chown
el artefacto,cp
el artefacto al volumen de host:Este truco funciona porque la
chown
invocación dentro del heredoc toma$(id -u):$(id -g)
valores desde fuera del contenedor en ejecución; es decir, el host docker.Los beneficios son:
docker container run --name
odocker container create --name
antesdocker container rm
despuésfuente
cp
y las respuestas basadas en el volumen. Además, para elid
truco de la propiedad, a veces es un verdadero dolor de cabezaLa mayoría de las respuestas no indican que el contenedor debe ejecutarse antes de
docker cp
que funcione:fuente
Windows Hyper-V
, aparentemente es necesaria para detener contenedor antes de copiar un archivo .Si no tiene un contenedor en ejecución, solo una imagen, y suponiendo que desea copiar solo un archivo de texto, puede hacer algo como esto:
fuente
Estoy publicando esto para cualquiera que esté usando Docker para Mac. Esto es lo que funcionó para mí:
Tenga en cuenta que cuando monto usando
-v
esebackup
directorio se crea automáticamente.Espero que esto sea útil para alguien algún día. :)
fuente
volumes
comando en la raíz de config.yml, para que varios contenedores puedan acceder a los volúmenes.Si solo desea extraer un archivo de una imagen (en lugar de un contenedor en ejecución), puede hacer esto:
docker run --rm <image> cat <source> > <local_dest>
Esto abrirá el contenedor, escribirá el nuevo archivo y luego eliminará el contenedor. Sin embargo, un inconveniente es que los permisos del archivo y la fecha de modificación no se conservarán.
fuente
https://docs.docker.com/engine/reference/commandline/run/ https://docs.docker.com/engine/reference/commandline/cp/
fuente
Con el lanzamiento de Docker 19.03, puede omitir la creación del contenedor e incluso crear una imagen. Hay una opción con las compilaciones basadas en BuildKit para cambiar el destino de salida. Puede usar esto para escribir los resultados de la compilación en su directorio local en lugar de en una imagen. Por ejemplo, aquí hay una compilación de un binario go:
Desde el Dockerfile anterior, estoy construyendo el
artifact
escenario que solo incluye los archivos que quiero exportar. Y la nueva--output
bandera introducida me permite escribirlos en un directorio local en lugar de una imagen. Esto debe realizarse con el motor BuildKit que viene con 19.03:Una vez completada la compilación,
app
se exportó el binario:Docker tiene otras opciones para el
--output
indicador documentadas en su repositorio de BuildKit ascendente: https://github.com/moby/buildkit#outputfuente
Como solución más general, hay un complemento de CloudBees para que Jenkins lo construya dentro de un contenedor Docker . Puede seleccionar una imagen para usar desde un registro de Docker o definir un Dockerfile para compilar y usar.
Montará el espacio de trabajo en el contenedor como un volumen (con el usuario apropiado), lo configurará como su directorio de trabajo, realizará los comandos que solicite (dentro del contenedor). También puede usar el complemento docker-workflow (si prefiere el código sobre la interfaz de usuario) para hacer esto, con el comando image.inside () {}.
Básicamente todo esto, integrado en su servidor CI / CD y algo más.
fuente
Usé PowerShell (Admin) con este comando.
Ejemplo
fuente
Otra buena opción es compilar primero el contenedor y luego ejecutarlo utilizando el indicador -c con el intérprete de shell para ejecutar algunos comandos
El comando anterior hace esto:
-yo = ejecuta el contenedor en modo interactivo
--rm = eliminó el contenedor después de la ejecución.
-v = compartió una carpeta como volumen desde la ruta del host a la ruta del contenedor.
Finalmente, / bin / sh -c le permite introducir un comando como parámetro y ese comando copiará sus archivos de tarea a la ruta del contenedor.
Espero que esta respuesta adicional te pueda ayudar
fuente
Cree un directorio de datos en el sistema host (fuera del contenedor) y móntelo en un directorio visible desde el interior del contenedor. Esto coloca los archivos en una ubicación conocida en el sistema host y facilita que las herramientas y aplicaciones en el sistema host accedan a los archivos
fuente
Cree una ruta donde desee copiar el archivo y luego use:
fuente
Puede usar en
bind
lugar devolume
si desea montar solo una carpeta, no crear un almacenamiento especial para un contenedor:Construye tu imagen con la etiqueta:
docker build . -t <image>
Ejecute su imagen y enlace el directorio $ (pwd) actual donde se almacena app.py y asígnelo a / root / example / dentro de su contenedor.
docker run --mount type=bind,source="$(pwd)",target=/root/example/ <image> python app.py
fuente
Esto también se puede hacer en el SDK, por ejemplo, python. Si ya tiene un contenedor integrado, puede buscar el nombre a través de la consola (
docker ps -a
). El nombre parece ser una concatenación de un científico y un adjetivo (es decir, "relax_pasteur").Echa un vistazo a
help(container.get_archive)
:Entonces, algo como esto se extraerá de la ruta especificada (/ salida) en el contenedor a su máquina host y desempaquetará el tar.
fuente