Construye y ejecuta Dockerfile con un comando


136

¿Es posible construir una imagen desde Dockerfile y ejecutarla con un solo comando?
Hay un comando docker buildpara construir un Dockerfile y docker run -itejecutar la imagen.

¿Existe alguna combinación de estos dos comandos para que sea más fácil construir y ejecutar con un solo comando?


Si elabora su caso de uso, puede haber mejores opciones que podemos presentar.
Jonathon Reinhart

77
@JonathonReinhart Mi caso de uso es iterar rápidamente cuando estoy editando un Dockerfile en el que estoy trabajando.
Shubham Chaudhary

Respuestas:


154

No, no hay un solo comando. Pero si etiqueta su imagen a medida que la construye, será más fácil de ejecutar:

docker build -t foo . && docker run -it foo

2
Buena respuesta porque se puede entonces quitar fácilmente la imagen si desea: docker rmi foo.
Sarkis Varozian

237

Si desea evitar el etiquetado, solo docker build -qgenera el hash de imagen final , que puede usar como argumento para docker run:

docker run -it $(docker build -q .)

Y añadir --rma docker runsi desea que el contenedor elimina automáticamente cuando sale.

docker run --rm -it $(docker build -q .)

9
Mejor que la respuesta aceptada, ya que no satura el repositorio de imágenes local
InsOp

18
@InsOp En realidad, esto también produce imágenes locales. Simplemente no están etiquetados.
Jonathon Reinhart

2
Lamentablemente, esto no le muestra la salida de compilación regular de docker build: /
Lion

1
@ León que el punto de -qopción. Para que sea silencioso, generar solo la etiqueta autogenerada. Y eso es. Siéntase libre de transformar ese stdin como desee.
Salathiel Genèse

Para obtener el resultado de la compilación, debe adaptar la respuesta de Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool

5

Si usa Makefile, este fragmento me parece útil:

build:
    @docker build . | tee .buildlog

bash: build
    @docker run --rm -it $(shell grep "Successfully built" .buildlog | cut -d ' ' -f 3) /bin/bash

No necesita etiquetado, como en la respuesta @ jonathon-reinhart, pero también obtiene la salida de compilación.


5

Utilizo docker-compose para esta conveniencia ya que la mayoría de las aplicaciones que estoy construyendo están hablando con servicios externos tarde o temprano, así que si voy a usarlo de todos modos, ¿por qué no usarlo desde el principio? Solo tenga docker-compose.yml como:

version: "3"
services:
  app:
    build: .

y luego solo ejecuta la aplicación con:

docker-compose up --build app

Reconstruirá la imagen o reutilizará el contenedor dependiendo de si hubo cambios en la definición de la imagen.


0

PC con Windows

Haz un run.batarchivo. Luego en el archivo agregue esto:

docker build -t foo . 
docker run -it foo

Para ejecutar el archivo usando powershell o cmd, haga esto:

./run.bat

0

docker-build-and-run

He creado un pequeño comando auxiliar para construir y ejecutar, en un solo comando. En Linux o Mac, puede agregar esto a su~/.bash_profile para que esté disponible en la Terminal.

Uso:

docker-build-and-run BUILD_ARGS [-- RUN_ARGS] [-- RUN_COMMAND]

Ejemplos:

docker-build-and-run . -- npm run test
docker-build-and-run --file ./Dockerfile . -- -v ~/volume:/var/volume -- node server.js

La secuencia de comandos:

Agregue esto a un .sharchivo, o agréguelo a su ~/.bash_profile:

TERM_GREEN="\033[1;32m"
TERM_BLUE="\033[1;34m"
TERM_NC="\033[0m"
docker-build-and-run() {
    if [[ -z "$@" ]]; then
        echo "
            Usage:
                docker-build-and-run BUILD_ARGS [-- RUN_ARGS] [-- RUN_COMMAND]
            Examples:
                docker-build-and-run . -- npm run test
                docker-build-and-run --file ./Dockerfile . -- -v ~/volume:/var/volume -- node server.js
        "
        return
    fi

    # Extract the segments between the dashes:
    BEFORE_THE_DASHES=
    while (( "$#" )); do
        if [[ "$1" = "--" ]]; then
            shift
            break
        fi
        BEFORE_THE_DASHES="$BEFORE_THE_DASHES $1"
        shift
    done
    SEGMENT_1=$BEFORE_THE_DASHES

    BEFORE_THE_DASHES=
    while (( "$#" )); do
        if [[ "$1" = "--" ]]; then
            shift
            break
        fi
        BEFORE_THE_DASHES="$BEFORE_THE_DASHES $1"
        shift
    done
    SEGMENT_2=$BEFORE_THE_DASHES

    SEGMENT_3=$@


    BUILD_ARGS=$SEGMENT_1
    RUN_ARGS=$SEGMENT_2
    RUN_COMMAND=$SEGMENT_3
    if [ -z "$RUN_COMMAND" ]; then
      RUN_COMMAND=$RUN_ARGS
      RUN_ARGS=
    fi


    TEMP_TAG=docker-build-and-run-temp

    docker rm -f $TEMP_TAG 2>/dev/null
    printf "${TERM_GREEN}Building Docker container (${TERM_BLUE}docker build $BUILD_ARGS${TERM_GREEN})${TERM_NC}\n" \
    && docker build --tag $TEMP_TAG $BUILD_ARGS \
    && printf "${TERM_GREEN}Running Docker container (${TERM_BLUE}docker run $RUN_ARGS $RUN_COMMAND${TERM_GREEN})${TERM_NC}\n" \
    && docker run --rm -it $RUN_ARGS --label $TEMP_TAG $TEMP_TAG $RUN_COMMAND
}

0

También puede hacer docker buildy canalizar el nombre de la imagen a la que da salida docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build le dará texto de varias líneas ... Successfully built 18e77bc0d83a
  • obtienes la última línea con tail -n1
  • dividirse ' 'y obtener3 rd word concut -d' ' -f3
  • pasarlo como argumento runconxargs -I{} docker run {}

¡agregue | tee /dev/ttydespués docker build .para obtener la salida completa!
oliverpool

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.