【问题标题】:Is it possible to add environment variables in automated builds in docker hub?是否可以在 docker hub 的自动构建中添加环境变量?
【发布时间】:2017-12-29 20:07:36
【问题描述】:

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

【问题讨论】:

  • 有同样的问题...我设法找到的是,我们需要为此使用 docker cloud,并且在后台 docker cloud 将使用 doke hub 进行自动构建,但也让您能够通过 UI 或挂钩文件设置环境变量。作为奖励,您还将获得图像的自动测试!仍在努力澄清所有这些的价格。
  • 我停止了为那个特定项目工作,所以我不必为这个问题寻找任何解决方法。据我所知,没有其他方法可以做到这一点。

标签: docker build-settings automated-deploy


【解决方案1】:

设置自动构建

Docker Hub (https://hub.docker.com) 可以从外部存储库中的源代码自动构建映像,并自动将构建的映像推送到您的 Docker 存储库,该存储库将托管在您的 Docker Hub 存储库帐户例如: 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 Hub UI 配置的环境变量将在您的构建过程中使用。通过单击构建环境变量部分旁边的加号添加您的build environment variables,然后输入变量名称和值。

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

构建钩子示例(以实现 Docker Hub UI Env vars)

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

示例:

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

第 1 步。 将此添加到自动构建的 Web UI 中以用于“构建环境变量”

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

#!/bin/bash

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

注意:这里的$TERRAFORM_VERSION 来自网络用户界面。

第三步: 在你的 Dockerfile 中

ARG TERRAFORM_VERSION
ENV TERRAFORM_VERSION $TERRAFORM_VERSION

注意:这里的$TERRAFORM_VERSION 来自名为build 的bash 脚本文件中的自定义构建参数。

完整示例: 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 集群,却发现它构建了错误的镜像。我希望这可以减轻其他人同样的痛苦
【解决方案2】:

一个例子:

  • 第 1 步。 创建 Dockerfile:

    ARG NODE_VERSION
    
    FROM node:$NODE_VERSION
    
  • 第 2 步。 创建挂钩/构建文件:

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

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2019-02-25
    • 2021-11-18
    • 2020-06-08
    • 1970-01-01
    • 2021-09-25
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多