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

时间:2017-12-03 06:03:47

标签: docker docker-compose dockerfile rancher

我通过Docker-compose通过Rancher提供服务。我遇到的问题是我需要在部署容器后设置密码。

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

我不相信我有办法通过Dockerfile获取秘密,因为我不想让这个秘密存在于git中,所以我只是想通过docker来做这件事-compose。

有人知道这是否可行?

4 个答案:

答案 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";
    }
}
  • 在第一部分中,我只是启动了我的服务(mongo)
  • 第二项服务使用“ bash”入口点和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操作。

  1. 在您的映像中添加一个脚本,该脚本将执行您想要的初始化工作,例如设置密码,更改内部配置文件等。让我们称之为init.sh。您可以将其添加到图像中。
  2. Dockerfile:

    FROM: sourceimage:tag
    COPY init.sh /usr/local/bin/
    
    1. 现在在您的docker compose文件中,只需在执行容器主操作之前调用该init脚本。
    2. 搬运工-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>