是否可以从Dockerfile构建映像并使用单个命令运行它?
有一个命令docker build
可以构建Dockerfile并docker run -it
运行映像。
这两个命令是否有任何组合,以使仅使用一个命令就可以更轻松地构建和运行它?
是否可以从Dockerfile构建映像并使用单个命令运行它?
有一个命令docker build
可以构建Dockerfile并docker run -it
运行映像。
这两个命令是否有任何组合,以使仅使用一个命令就可以更轻松地构建和运行它?
Answers:
不,没有单个命令。但是,如果您在构建图像时对其进行标记,则将更易于运行:
docker build -t foo . && docker run -it foo
docker rmi foo
。
如果要避免标记,docker build -q
则只输出最终的图像哈希值,您可以将其用作以下参数docker run
:
docker run -it $(docker build -q .)
并添加--rm
到docker run
,如果你想退出时容器自动删除。
docker run --rm -it $(docker build -q .)
docker build
:/
-q
选择的重点。为了使其安静,仅输出自动生成的标签。就是这样。随意转换您喜欢的标准输入。
docker build . | tee /dev/tty | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run --rm {}
为了方便起见,我使用docker-compose,因为我正在构建的大多数应用迟早都会与外部服务进行通信,因此,无论如何我都要使用它,为什么不从一开始就使用它。只需将docker-compose.yml作为:
version: "3"
services:
app:
build: .
然后使用以下命令运行该应用程序:
docker-compose up --build app
它将重建图像或重新使用容器,具体取决于是否对图像定义进行了更改。
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 build
输出到的图像名称进行管道处理docker run
:
docker build . | tail -n1 | cut -d' ' -f3 | xargs -I{} docker run {}
docker build
会给你多行文字 ... Successfully built 18e77bc0d83a
tail -n1
' '
并得到3
rd单词cut -d' ' -f3
run
withxargs -I{} docker run {}
| tee /dev/tty
后docker build .
获得完整的输出!
对于正在寻找可重用解决方案的任何人,您都可以安装我创建的这个docker插件:https : //github.com/stasmihailov/docker-script
然后,您可以按如下所示构建和运行Dockerfile:
docker script ./Dockerfile