2017-12-03 2138 views
1

我有一个服务,我通过码头工作人员通过牧场主进行创作。我遇到的问题是,我需要在部署容器后设置密码。docker-compose,容器启动后运行脚本?

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

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

有谁知道这是可能的吗?

+0

当然,这是设置秘密的一种相当普通的方式。只需将相关的shell脚本添加为(或者)您的CMD或ENTRYPOINT即可。 –

回答

0

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

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

目标文件名将与密码的名称相同。
默认情况下,目标文件名将被创建为用户ID和组ID 0,文件模式0444.
在秘密部分中将外部设置为真将确保它知道秘密已经创建。的基本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> 
0

关键是要覆盖排字命令调用原始命令之前执行任何你需要的初始化动作。

  1. 添加您的图像的脚本,将执行所要像设置的密码初始化工作,改变内部配置文件,等等。让我们把它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 
    

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