如何 mount/reuse docker-为 gitlab-runner CI 撰写秘密?
How to mount/reuse docker-compose secrets for gitlab-runner CI?
明确地说,我说的是 secrets
configuration 可用于 docker-compose
3.x。
我不是在谈论使用环境变量(来自主机或来自 Gitlab CI/CD 设置)传递秘密 keys/tokens。
假设我有这个 docker-compose
配置:
version: "3.7"
services:
my-app:
image: ubuntu:18.04
container_name: my-app-container
command: tail -f /dev/null
secrets:
- my_app_secrets
secrets:
my_app_secrets:
file: /path/to/secrets.txt
当我手动启动容器时
$ docker-compose up -d
$ docker-compose exec my-app bash
A /run/secrets/my_app_secrets 在容器内可用,包含与 secrets.txt 完全相同的内容。路径 /run/secrets/ 由 secrets
配置定义。
现在我需要对 Gitlab CI 管道使用相同的设置。不幸的是,我似乎找不到要放入 .gitlab-ci.yml or in the /etc/gitlab-runner/config.toml 的配置,这将允许我指定相同的 secrets
配置。我确定它没有安装,因为我使用自定义 ENTRYPOINT
脚本来检查 /run/secrets/my_app_secrets 文件,但它不存在。
if [[ ! -e "/run/secrets/my_app_secrets" ]];
then
print_error "Did not find mounted app secrets from host"
return 1
fi
我目前的解决方案是使用[runners.docker]部分下的volumes
配置,并挂载/path/to/secrets.txt作为常规卷。
volumes = [
"/path/to/secrets.txt:/run/secrets/my_app_secrets"
]
但我认为这有点重复配置,我手动指定 /run/secrets/secret_name 路径。
是否有另一种方法可以将 secrets
配置指定给 gitlab-runner?
ENV 详细信息:
- Gitlab CE 12.8.6
- gitlab-runner 12.7.1
- Docker 19.03.6
- docker-撰写 1.24.0
看来我误解了 secrets 配置的用法。
显然,它是为 Docker 集群设计的。
来自 Manage sensitive data with Docker secrets 文档:
Note: Docker secrets are only available to swarm services, not to standalone containers.
它仍然可以在 docker-compose
文件中为非 swarm 独立容器定义(就像在我的示例 docker-compose 文件中问题),它仍然会向您的容器添加 /run/secrets/secret-name。但是,它的行为类似于常规绑定安装。
来自 this Github issue 关于在没有群的情况下使用 Docker 秘密:
In docker-compose /run/secrets
is just a bind mount to the host.
Those secrets are not deployed to a swarm.
因此,对于 gitlab-runner 作业,您可以使用常规挂载模拟 secrets 功能:
volumes = [
"/path/to/my_app_secrets:/run/secrets/my_app_secrets"
]
明确地说,我说的是 secrets
configuration 可用于 docker-compose
3.x。
我不是在谈论使用环境变量(来自主机或来自 Gitlab CI/CD 设置)传递秘密 keys/tokens。
假设我有这个 docker-compose
配置:
version: "3.7"
services:
my-app:
image: ubuntu:18.04
container_name: my-app-container
command: tail -f /dev/null
secrets:
- my_app_secrets
secrets:
my_app_secrets:
file: /path/to/secrets.txt
当我手动启动容器时
$ docker-compose up -d
$ docker-compose exec my-app bash
A /run/secrets/my_app_secrets 在容器内可用,包含与 secrets.txt 完全相同的内容。路径 /run/secrets/ 由 secrets
配置定义。
现在我需要对 Gitlab CI 管道使用相同的设置。不幸的是,我似乎找不到要放入 .gitlab-ci.yml or in the /etc/gitlab-runner/config.toml 的配置,这将允许我指定相同的 secrets
配置。我确定它没有安装,因为我使用自定义 ENTRYPOINT
脚本来检查 /run/secrets/my_app_secrets 文件,但它不存在。
if [[ ! -e "/run/secrets/my_app_secrets" ]];
then
print_error "Did not find mounted app secrets from host"
return 1
fi
我目前的解决方案是使用[runners.docker]部分下的volumes
配置,并挂载/path/to/secrets.txt作为常规卷。
volumes = [
"/path/to/secrets.txt:/run/secrets/my_app_secrets"
]
但我认为这有点重复配置,我手动指定 /run/secrets/secret_name 路径。
是否有另一种方法可以将 secrets
配置指定给 gitlab-runner?
ENV 详细信息:
- Gitlab CE 12.8.6
- gitlab-runner 12.7.1
- Docker 19.03.6
- docker-撰写 1.24.0
看来我误解了 secrets 配置的用法。
显然,它是为 Docker 集群设计的。
来自 Manage sensitive data with Docker secrets 文档:
Note: Docker secrets are only available to swarm services, not to standalone containers.
它仍然可以在 docker-compose
文件中为非 swarm 独立容器定义(就像在我的示例 docker-compose 文件中问题),它仍然会向您的容器添加 /run/secrets/secret-name。但是,它的行为类似于常规绑定安装。
来自 this Github issue 关于在没有群的情况下使用 Docker 秘密:
In docker-compose
/run/secrets
is just a bind mount to the host.
Those secrets are not deployed to a swarm.
因此,对于 gitlab-runner 作业,您可以使用常规挂载模拟 secrets 功能:
volumes = [
"/path/to/my_app_secrets:/run/secrets/my_app_secrets"
]