我通过Docker-compose通过Rancher提供服务。我遇到的问题是我需要在部署容器后设置密码。
牧场主秘密工作的方式是,我设置了我的秘密,牧场主将使用包含我的秘密的文件在我的容器上装载一个卷。我希望能够执行一个脚本来获取该秘密,并将其设置为我的配置文件中的密码。
我不相信我有办法通过Dockerfile获取秘密,因为我不想让这个秘密存在于git中,所以我只是想通过docker来做这件事-compose。
有人知道这是否可行?
答案 0 :(得分:5)
这是在容器启动后不覆盖入口点的情况下调用脚本的方式。
在我的示例中,我用它来初始化本地MongoDB的副本集
#include <iostream>
#include <string>
bool divisibility (const std::string& A, int B) {
long long int remainder = 0;
int n = A.length();
for (char c: A) {
int fig = c - '0';
remainder = (10*remainder + fig) % B;
}
//std::cout << "remainder = " << remainder << "\n";
return remainder == 0;
}
int main() {
std::string A = "124356925";
for (int B: {3, 4, 5, 11, 13}) {
auto ans = divisibility (A, B);
std::cout << "divisibility of " << A << " by " << B << " is " << ans << "\n";
}
}
services:
mongo:
image: mongo:4.2.8
hostname: mongo
container_name: mongodb
entrypoint: ["/usr/bin/mongod","--bind_ip_all","--replSet","rs0"]
ports:
- 27017:27017
mongosetup:
image: mongo:4.2.8
depends_on:
- mongo
restart: "no"
entrypoint: [ "bash", "sleep 10 && mongo --host mongo:27017 --eval 'rs.initiate()'"]
<= 重要 我还在服务和设置服务之间使用restart: no
来管理启动订单。
答案 1 :(得分:3)
您也可以使用卷来做到这一点:
services:
example:
image: <whatever>
volume: ./init.sh:/init.sh
entrypoint: sh -c "/init.sh"
请注意,这会将 init.sh
挂载到容器,不会复制它(如果这很重要,通常不会)。基本上容器内的进程可以修改 init.sh
并且它会修改实际计算机中存在的文件。
答案 2 :(得分:2)
诀窍是覆盖compose COMMAND以在调用原始命令之前执行所需的任何init操作。
init.sh
。您可以将其添加到图像中。Dockerfile:
FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
搬运工-compose.yml:
services:
myservice:
image: something:tag
...
command: /usr/local/bin/init.sh && exec the_original_command_goes_here
在调用main命令之前使用exec
很重要。这将把命令安装为第一个进程(PID1),它将使它接收诸如停止或终止等信号。
答案 3 :(得分:0)
docker-compose指定如何启动容器,而不是如何修改现有正在运行的容器。
Rancher documentation提到,对于秘密的默认使用,您可以在docker-compose.yml
的秘密数组中按名称引用秘密。
目标文件名与秘密名称相同 默认情况下,目标文件名将创建为用户ID和组ID 0,文件模式为0444 在secrets部分中将external设置为true将确保它知道已经创建了秘密。
基本
的示例docker-compose.yml
:
version: '2'
services:
web:
image: sdelements/lets-chat
stdin_open: true
secrets:
- name-of-secret
labels:
io.rancher.container.pull_image: always
secrets:
name-of-secret:
external: true
如“How to Update a Single Running docker-compose Container”所示,更新容器将涉及“构建,终止和向上”序列。
docker-compose up -d --no-deps --build <service_name>