我想自动化我的构建过程,并需要传递一个环境变量以运行 Dockerfile
中的一些命令。我想知道在Dockerhub中是否有任何方法可以做到这一点。我知道docker cloud有类似的功能,但我想知道Dockerhub中是否有这种功能,因为在普通构建中cli有--build-args
参数。
我想自动化我的构建过程,并需要传递一个环境变量以运行 Dockerfile
中的一些命令。我想知道在Dockerhub中是否有任何方法可以做到这一点。我知道docker cloud有类似的功能,但我想知道Dockerhub中是否有这种功能,因为在普通构建中cli有--build-args
参数。
Docker Hub (https://hub.docker.com) 可以从外部仓库中的源代码自动构建镜像,并将构建完成的镜像自动推送到由你的 Docker Hub 仓库托管的镜像,这些镜像将在你的 Docker Hub 仓库账户下托管 例如: https://cloud.docker.com/u/binbash/repository/list
当你设置自动化构建(也称为autobuilds
)时,你会创建一个列表,列出要构建为 Docker 镜像的分支
和标签
。当你向其中一个列出的镜像标签的源代码分支(目前只支持 GitHub / Bitbucket)推送代码时,该推送将使用一个 webhook
来触发新的构建,从而产生一个 Docker 镜像。然后将构建的镜像推送到 Docker Hub 注册表。
有关详细的实现步骤,请参见https://docs.docker.com/docker-hub/builds/
你可以设置 环境变量 的值(实际上它们被映射为构建 ARG 值 - docker build --build-arg
- 仅在构建时使用 - https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg)。
不要将其与运行时由你的服务使用的环境值 ENV VARS 混淆 (docker run --env MYVAR1=foo
- https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/#set-environment-variables--e-env-env-file)
Docker Hub UI 中配置的这些构建环境变量
,在你配置自动化构建时会用于你的构建过程。通过单击构建环境变量部分旁边的加号,然后输入变量名称和值来添加你的构建环境变量
。
当你从 Docker Hub UI 设置变量值时,它们可以由你在hooks 文件中设置的命令使用(这非常重要,下面将进行扩展),但它们是存储的,只有那些具有 Docker Hub 仓库管理员访问权限的用户才能查看它们的值。这意味着你可以使用它们安全地存储访问令牌或其他应保密的信息。
#!/bin/bash
docker build -t $IMAGE_NAME --build-arg TERRAFORM_VERSION=$TERRAFORM_VERSION .
注意: 这里的 $TERRAFORM_VERSION
来自 Web UI。
步骤3: 在你的 Dockerfile 中
ARG TERRAFORM_VERSION
ENV TERRAFORM_VERSION $TERRAFORM_VERSION
注意:这里的$TERRAFORM_VERSION
来自于你的bash脚本文件中的自定义构建参数build
。
完整示例:https://github.com/binbashar/public-docker-images/tree/master/terraform-resources
就是这样!现在应该可以工作了。在Docker Hub中将“构建环境变量”重命名为“自定义钩子环境变量”,可以使官方文档(https://docs.docker.com/docker-hub/builds/advanced/)中的概念更易于理解。
启动构建脚本时设置了许多关键的环境变量,其中所有的环境变量都可以在您的钩子中使用,并且在制作自定义构建参数时都非常有用。
SOURCE_BRANCH: the name of the branch or the tag that is currently being tested.
SOURCE_COMMIT: the SHA1 hash of the commit being tested.
COMMIT_MSG: the message from the commit being tested and built.
DOCKER_REPO: the name of the Docker repository being built.
DOCKERFILE_PATH: the Dockerfile currently being built.
DOCKER_TAG: the Docker repository tag being built.
IMAGE_NAME: the name and tag of the Docker repository being built. (This variable is a combination of DOCKER_REPO:DOCKER_TAG.)
一个例子:
Step 1. Create the Dockerfile:
ARG NODE_VERSION
FROM node:$NODE_VERSION
Step 2. Create the hooks/build file:
#!/bin/bash
NODE_VERSION=$(echo $DOCKER_TAG | cut -d "-" -f2)
if [ $DOCKER_TAG == "latest" ]
then
docker build . --build-arg NODE_VERSION=${DOCKER_TAG} -t ${IMAGE_NAME}
else
docker build . --build-arg NODE_VERSION=${NODE_VERSION} -t ${IMAGE_NAME}
fi
Source: github.com/SamuelA