是否有可能从Dockerfile构建镜像,并使用一个命令运行它? docker build命令用于构建Dockerfile, docker run -it命令用于运行映像。

是否存在这两个命令的组合,以使仅使用一个命令就可以更容易地构建和运行?


当前回答

docker-build-and-run

我在一个命令中创建了一个用于构建和运行的小助手命令。在Linux或Mac上,您可以将此添加到~/。bash_profile使其在终端中可用。

用法:

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

例子:

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

脚本:

将其添加到.sh文件中,或添加到~/.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
}

其他回答

为了方便起见,我使用docker-compose,因为我正在构建的大多数应用程序迟早都会与外部服务通信,所以如果我无论如何都要使用它,为什么不从一开始就使用它呢?只需要docker-compose。yml:

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

然后运行应用程序:

docker-compose up --build app

它将重建图像或重用容器,这取决于是否对图像定义进行了更改。

Windows电脑

生成run.bat文件。然后在文件中添加这个:

docker build -t foo . 
docker run -it foo

要使用powershell或cmd运行文件,请执行以下操作:

./run.bat

如果你使用Makefile,我发现这个片段很有用:

build:
    @docker build . | tee .buildlog

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

您不需要像@ jonathan -reinhart answer中那样的标记,但是您也可以得到构建输出。

如果你想避免标记,docker build -q只输出最终的图像散列,你可以使用它作为docker run的参数:

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

如果你想在容器退出时自动移除,则在docker run中添加——rm。

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

最近,我开始收到关于每次构建后使用docker扫描的宣传信息。

使用“docker扫描”对图像运行Snyk测试,以查找漏洞并学习如何修复它们

这是我过去常做的事:

docker build --quiet .

这就是现在的工作方式:

docker build --quiet . | head -n1