docker build
docker run -it
是否存在这两个命令的组合,以使仅使用一个命令就可以更容易地构建和运行?
不,没有单一的命令。但是如果你在构建图像时给它打上标签,它会更容易运行:
docker build -t foo . && docker run -it foo
如果你想避免标记,docker build -q只输出最终图像哈希,你可以使用它作为docker run的参数:
docker build -q
docker run
docker run -it $(docker build -q .)
并添加--rm到docker run,如果你想在容器退出时自动删除。
--rm
docker run --rm -it $(docker build -q .)
如果你使用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中那样的标记,但是您也可以得到构建输出。
创建一个run.bat文件。然后在文件中添加这个:
run.bat
docker build -t foo . docker run -it foo
要使用powershell或cmd运行文件,请执行以下操作:
./run.bat
docker-build-and-run
我在一个命令中创建了一个用于构建和运行的小助手命令。在Linux或Mac上,你可以将它添加到你的~/.bash_profile中,使它在终端中可用。
~/.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文件中:
.sh
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 build和管道图像名称,它输出到docker run:
docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
... Successfully built 18e77bc0d83a
tail -n1
' '
3
cut -d' ' -f3
xargs -I{} docker run {}
run
为了方便起见,我使用docker-compose,因为我正在构建的大多数应用程序迟早都会与外部服务通信,所以如果我无论如何都要使用它,为什么不从一开始就使用它呢?只需要docker-compose。yml:
version: "3" services: app: build: .
然后运行应用程序:
docker-compose up --build app
它将重建图像或重用容器,这取决于是否对图像定义进行了更改。
然后你可以构建并运行Dockerfile,如下所示:
docker script ./Dockerfile
最近,我开始收到关于每次构建后使用docker scan的促销消息。
docker scan
使用“docker扫描”对图像运行Snyk测试,以查找漏洞并学习如何修复它们
下面是我使用要做的:
docker build --quiet .
这就是现在的工作方式:
docker build --quiet . | head -n1