在Docker Hub的自动化构建中是否可以添加环境变量?

12

我想自动化我的构建过程,并需要传递一个环境变量以运行 Dockerfile 中的一些命令。我想知道在Dockerhub中是否有任何方法可以做到这一点。我知道docker cloud有类似的功能,但我想知道Dockerhub中是否有这种功能,因为在普通构建中cli有--build-args参数。


我也有同样的问题... 我所找到的是,我们需要使用Docker Cloud来实现这一点,在Docker Cloud的后台中,它将使用Docker Hub进行自动构建,并且还可以通过UI或挂钩文件设置环境变量。 作为额外的奖励,您还将获得图像的自动测试! 仍在努力澄清所有这些的价格。 - sshepel
我停止了为那个特定的项目工作,所以我不必寻找任何解决问题的方法。据我所知,没有其他方法可以做到这一点。 - Soccergods
2个回答

26

设置自动化构建

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 仓库管理员访问权限的用户才能查看它们的值。这意味着你可以使用它们安全地存储访问令牌或其他应保密的信息。

构建钩子示例(用于实现 Docker Hub UI 环境变量)

从自动构建的Web UI中添加变量将使它们在钩子内可用。在钩子中,您必须使用该值使用“--build-arg”设置自定义构建参数。最后,您必须在您的Dockerfile中使用此自定义构建参数手动设置环境变量,使用“ENV”命令或“export”。
例如:假设您想要在构建环境中设置环境变量“TERRAFORM_VERSION='0.12.0-beta2'”
步骤1:在自动构建的Web UI中添加“构建环境变量”
步骤2:创建一个自定义构建钩子即创建一个名为“hooks”的文件夹,与您的Dockerfile位于同一目录中。在hooks文件夹中,创建一个名为“build”的文件。这将创建自定义构建挂钩。Docker将使用此来构建您的镜像。build的内容如下:
#!/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.)

警告 - 如果您为Dockerfile使用自定义名称,例如nginx.Dockerfile,则此方法将无法正常工作。 Docker HUB的命令正在覆盖$ DOCKERFILE_PATH。为了保持此功能,请使用“docker build -f $DOCKERFILE_PATH -t $IMAGE_NAME --build-arg TERRAFORM_VERSION = $TERRAFORM_VERSION .”。我花了一天多时间调试K8集群,最终发现它正在构建错误的映像。我希望这能避免其他人遭受同样的痛苦。 - Will Squire

3

一个例子:

  • 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接