docker-compose,在容器启动后运行一个脚本?

我有一个服务,通过docker工作人员通过牧场主进行。 我遇到的问题是,我需要在部署容器后设置密码。

牧场主秘密的工作方式是我把秘密放在里面,牧场主会用我的秘密文件在我的容器上装上一个卷。 我希望能够执行一个脚本来获取该秘密,并将其设置为我的configuration文件的密码。

我不相信我有办法通过Dockerfile得到这个秘密,因为我不想把秘密放在git中,所以我只能通过docker-compose来做这件事。

有谁知道这是可能的吗?

docker-compose指定如何启动容器,而不是如何修改现有的运行容器。

Rancher文档提到,对于秘密的默认使用,您可以通过docker-compose.yml中的秘密数组中的名称引用秘密。

目标文件名将与秘密的名称相同。
默认情况下,目标文件名将被创build为用户ID和组ID 0,文件模式0444。
在秘密部分设置外部为真将确保它知道秘密已经被创build。

基本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 

如“ 如何更新单个运行的docker-compose容器 ”中所述,更新容器将涉及“构build,终止和结束”序列。

 docker-compose up -d --no-deps --build <service_name> 

诀窍是在调用原始命令之前,覆盖组合命令以执行所需的任何初始化操作。

  1. 在图像中添加一个脚本,它将执行你想要的初始化工作,比如设置密码,更改内部configuration文件等等。我们称之为init.sh 你把它添加到你的形象。

Dockerfile:

 FROM: sourceimage:tag COPY init.sh /usr/local/bin/ 
  1. 现在在您的docker撰写文件中,只需在执行容器主要操作之前调用该init脚本即可。

泊坞窗,compose.yml:

 services: myservice: image: something:tag ... command: /usr/local/bin/init.sh && exec the_original_command_goes_here 

在调用main命令之前使用exec是很重要的。 这将安装命令作为第一个进程(PID1),这将使其接收信号,如停止或杀死。