docker - 如何创建自定义 Docker 映像并将其用作 GitLab CI/CD 服务?
问题描述
我正在使用 CloudFoundry 来部署我的服务,我的 E2E 测试是使用 Postman(CLI 上的 Newman)完成的。情况是我无法从我的 GitLab CI/CD 直接访问某些服务,然后我需要创建一个 SSH 隧道 (cf ssh) 以便能够在 CI/CD 管道期间通过隧道执行 Postman 集合。
这是我的 Dockerfile:
FROM my-private-registry/cf-cli-image
COPY ./images/cf-ssh-tunnel-service/docker-entrypoint.sh /docker-entrypoint.sh
EXPOSE 9001
ENTRYPOINT ["/docker-entrypoint.sh"]
这是docker-entrypoint.sh
:
#!/bin/bash
set -eo pipefail
# usage: file_env VAR [DEFAULT]
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
file_env 'CF_SSH_SERVICE_APP_NAME'
file_env 'CF_SSH_SERVICE_REMOTE_PORT' 8080
CF_SSH_SERVICE_LOCAL_PORT=9001
echo "Logging in ..."
cf login -a $CF_URL -u $CF_DEPLOY_USER -p $CF_DEPLOY_PASSWORD -o $CF_ORG -s $CF_SPACE --skip-ssl-validation
cf target
echo "Creating the CF SSH Tunnel to $CF_SSH_SERVICE_APP_NAME:$CF_SSH_SERVICE_REMOTE_PORT though the local port $CF_SSH_SERVICE_LOCAL_PORT."
cf ssh -k -T -N $CF_SSH_SERVICE_APP_NAME -L $CF_SSH_SERVICE_LOCAL_PORT:0.0.0.0:$CF_SSH_SERVICE_REMOTE_PORT
echo "DONE!"
最后这就是我在 GitLab 管道中使用图像作为服务的方式:
stages:
- e2e-test
newman:test:development:
image: my-private-registry/curl-image
stage: e2e-test
services:
- name: my-private-registry/cf-ssh-tunnel-service:latest
alias: cf-ssh-tunnel-service
variables:
CF_SSH_SERVICE_APP_NAME: $APP_NAME
script:
- curl http://cf-ssh-tunnel-service:9001/endpoint
如您所见,我正在基于该图像创建服务。然后当我运行管道时,curl
请求返回一个Could not resolve host: cf-ssh-tunnel-service
.
问:如何创建 Docker 映像以用作 GitLab 中的服务?
问:我应该如何创建 CF SSH 隧道作为 GitLab 的监听服务?
解决方案
除非您的图像存储在GitLab 容器注册表中,否则您将无法访问您的自定义图像(因为它需要登录到私有存储库才能拉取它)。
我可以考虑两种解决方案:
- 在个人机器上创建自定义 docker runner :
sudo gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com
Please enter the gitlab-ci token for this runner
xxx
Please enter the gitlab-ci description for this runner
[hostname] my-runner
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
Please enter the Docker image (eg. ruby:2.1):
alpine:latest
这里有几点注意事项:
- 您可以在 Settings > CI/CD > Runners 的项目中找到您的 gitlab-ci 令牌
- Gitlab-runner register 需要你指定一个默认的 docker 镜像(如果你在没有指定要使用的镜像的情况下调用运行器)但它会使用你告诉它使用的镜像。
如果您选择该选项,则必须将该tags: [docker-runner-tag]
命令添加到您的作业中.gitlab-ci.yml
。不要忘记在您注册自定义 docker runner 的机器上执行 docker login,否则 pull 仍然会失败。您可能还必须将 gitlab-runner 添加到 docker 的授权用户组中:
sudo usermod -aG docker gitlab-runner
- 创建 GitLab 容器注册表。我从未使用过该选项,因此我不会详细介绍,但您应该在项目的 Packages > Container Registry 部分找到创建全新容器注册表的说明。
我认为 Docker Hub 还提供了私有注册表选项,但我不知道这些服务是否可以免费使用。
推荐阅读
- c# - 为什么可以实例化一个接口?
- python - 如果存在匹配条件,则从数据框中获取 n 行,否则至少 m 行
- vue.js - 模块 highlight.js 没有导出成员 HLJSStatic & IModeBase
- java - AVRO:使用联合记录类型时保留联合记录字段名称
- android - 使用 Android VOLLEY 迭代和解析嵌套的 JSON 对象
- javascript - 绕过测试文件中的一些 require() 语句
- javascript - 在哪里使 API 命中 ComonentDidMount 或在 ComonentDidUpdate [React.JS]
- javascript - 将类分配给添加后的元素
- css - 如何让我的 Vue 网页填满整个视口?
- javascript - 如何使用 javascript 切换遍历所有类?