是否可以在 docker hub 的自动构建中添加环境变量?

Is it possible to add environment variables in automated builds in docker hub?

我想自动化构建过程,需要将环境变量传递给 运行 Dockerfile 中的一些命令。我想知道在 Dockerhub 中是否有任何方法可以做到这一点。我知道 docker 云有这样的东西,但我想知道 Dockerhub 中是否有这个功能,因为正常构建的 cli 中有 --build-args 参数。

设置自动构建

Docker 集线器 (https://hub.docker.com) can automatically build images from source code in an external repository and automatically push the built image to your Docker repositories which will be hosted under your Docker Hub repositories account Eg: https://cloud.docker.com/u/binbash/repository/list

当您设置自动构建(也称为 autobuilds)时,您会创建一个包含 branchestags 的列表,您希望将其构建到 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 集线器 UI 配置的环境变量在您配置自动构建时用于构建过程。通过单击 构建环境变量部分 旁边的加号添加 build environment variables,然后输入变量名称和值。

当您从 Docker 集线器 UI 设置变量值时,它们可以被您在 挂钩文件 中设置的命令使用(这非常重要 并将在下面进行扩展),但它们的存储方式只有对 Docker Hub 存储库具有管理员访问权限的用户才能看到它们的值。这意味着您可以使用它们来安全地存储访问令牌或其他应该保密的信息。

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

从自动构建的网络 UI 添加变量使它们在 hooks 中可用。在挂钩中,您必须使用该值来使用 --build-arg 设置 自定义构建参数 。最后,您必须在 Dockerfile 中使用此自定义构建 arg 以使用 ENV 命令或 export.

手动设置环境变量

示例:

说你想要一个环境变量 TERRAFORM_VERSION='0.12.0-beta2' 在你的构建环境中

步骤 1. 在自动构建的网站 UI 中为“构建环境变量”添加这个

步骤 2. 创建一个自定义构建挂钩,即在与您的 Dockerfile 相同的目录中创建一个名为 hooks 文件夹。在 hooks 文件夹中,创建一个名为 build 的文件。这将创建自定义构建挂钩。 Docker 将使用它来构建您的图像。构建内容:

#!/bin/bash

docker build -t $IMAGE_NAME --build-arg TERRAFORM_VERSION=$TERRAFORM_VERSION .

注意:此处$TERRAFORM_VERSION来自网络UI。

第三步: 在您的 Docker 文件中

ARG TERRAFORM_VERSION
ENV TERRAFORM_VERSION $TERRAFORM_VERSION

注意: 这里 $TERRAFORM_VERSION 来自你的 bash 脚本文件中名为 build.[=36= 的自定义构建参数]

完整示例: 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.)

例子:

  • 步骤 1. 创建 Dockerfile:

    ARG NODE_VERSION
    
    FROM node:$NODE_VERSION
    
  • 步骤 2. 创建 hooks/build 文件:

    #!/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
    

来源: github.com/SamuelA