Crie e execute o Dockerfile com um comando

136

É possível criar imagem do Dockerfile e executá-lo com um único comando?
Há um comando docker buildpara criar um Dockerfile e docker run -itexecutar a imagem.

Existe alguma combinação desses dois comandos para facilitar a criação e a execução com apenas um comando?

Cintilação
fonte
Se você elaborar seu caso de uso, pode haver opções melhores que podemos apresentar.
Jonathon Reinhart
7
@JonathonReinhart Meu caso de uso é iterar rapidamente quando estou editando um Dockerfile em que estou trabalhando.
Shubham Chaudhary

Respostas:

154

Não, não há um comando único. Mas se você marcar sua imagem conforme a compila, será mais fácil executar:

docker build -t foo . && docker run -it foo
Jonathon Reinhart
fonte
2
Boa resposta, porque você pode então remover facilmente a imagem, se desejar: docker rmi foo.
Sarkis Varozian 6/01/19
237

Se você deseja evitar a marcação, docker build -qnão gera nada além do hash da imagem final , que você pode usar como argumento para docker run:

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

E adicionar --rma docker runse desejar que o recipiente removido automaticamente quando ele sai.

docker run --rm -it $(docker build -q .)
assustador
fonte
9
Melhor do que a resposta aceite, uma vez que não atravancar o repositório de imagem local
InsOp
18
@InsOp Na verdade, isso também produz imagens locais. Eles simplesmente não estão marcados.
Jonathon Reinhart
2
Infelizmente isso não mostra a saída de compilação regular de docker build: /
Lion
1
@ Leão que o ponto de -qopção. Para silenciá-lo, produza apenas a tag gerada automaticamente. E é isso. Sinta-se livre para transformar esse estilo como quiser.
Salathiel Genèse
Para obter a saída da compilação, você deve adaptar a resposta de Viacheslav Shalamov :docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
oliverpool
5

Se você usa o Makefile, acho este trecho útil:

build:
    @docker build . | tee .buildlog

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

Você não precisa de marcação, como na resposta @ jonathon-reinhart, mas também obtém o resultado da compilação.

tavlima
fonte
5

Eu uso o docker-composite para essa conveniência, pois a maioria dos aplicativos que estou construindo está conversando com serviços externos mais cedo ou mais tarde; portanto, se eu vou usá-lo de qualquer maneira, por que não usá-lo desde o início. Basta ter o docker-compose.yml como:

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

e, em seguida, basta executar o aplicativo com:

docker-compose up --build app

Ele reconstruirá a imagem ou reutilizará o contêiner, dependendo se foram feitas alterações na definição da imagem.

Dejan Simic
fonte
0

PC com Windows

Faça um run.batarquivo. Em seguida, no arquivo, adicione este:

docker build -t foo . 
docker run -it foo

Para executar o arquivo usando o powershell ou o cmd, faça o seguinte:

./run.bat
Roubar
fonte
0

docker-build-and-run

Eu criei um pequeno comando auxiliar para criar e executar, em um único comando. No Linux ou Mac, você pode adicioná-lo ao seu ~/.bash_profilepara disponibilizá-lo no Terminal.

Uso:

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

Exemplos:

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

O Script:

Adicione isso a um .sharquivo ou adicione-o ao seu ~/.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
}
Scott Rippey
fonte
0

Você também pode fazer docker builde canalizar o nome da imagem para a qual ela gera docker run:

docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
  • docker build fornecerá texto com várias linhas ... Successfully built 18e77bc0d83a
  • você recebe a última linha com tail -n1
  • dividir por ' 'e obter 3palavra comcut -d' ' -f3
  • passá-lo como argumento para runcomxargs -I{} docker run {}
Viacheslav Shalamov
fonte
adicione | tee /dev/ttydepois docker build .para obter a saída completa!
oliverpool
0

Para quem procura uma solução reutilizável, você pode instalar este plugin do docker que eu criei: https://github.com/stasmihailov/docker-script

Em seguida, você pode criar e executar um Dockerfile da seguinte maneira:

docker script ./Dockerfile
Denis Babochenko
fonte