Docker 在容器启动前运行 SED 命令

Docker 在容器启动前运行 SED 命令

我正在使用 docker-compose 和 Dockerfile 运行 Rundeck,我需要修改容器内文件内的值。

我可以在构建阶段进行时从另一个地方(本地)复制修改后的文件并将其放置在容器内,但不知何故该文件会被原始文件替换,并且这种方法不起作用。

我也尝试在 Dockerfile 中运行 SED 命令(这样我就可以修改文件的确切行),但这仍然不起作用,容器显示原始文件,其中没有任何修改。

因此,我知道图像是可变的并且无法修改(这也不是一个好的做法)。

我在这里能做什么?每次运行新的 Rundeck 映像时,在文件中应用我需要的修改的最佳方法是什么?

复制场景: Dockerfile

FROM rundeck/rundeck:4.2.3-rc1-20220712    
WORKDIR /home/rundeck    
RUN sudo apt-get update
RUN sudo apt-get install nano

Docker-compose(注意 yml 格式!)

version: '3.4'
services:
rundeck:
    restart: always
    build: .
    container_name: rundeck
    links:
      - mysql
    tty: true
    ports:
      - 4444:4440
    environment:
        RUNDECK_GRAILS_URL: http://192.168.1.5:4444
        RUNDECK_SERVER_FORWARDED: 'true'
        RUNDECK_DATABASE_DRIVER: org.mariadb.jdbc.Driver
        RUNDECK_DATABASE_USERNAME: rundeck
        RUNDECK_DATABASE_PASSWORD: rundeck
        RUNDECK_LOGLEVEL_DEFAULT: info
        RUNDECK_DATABASE_URL: jdbc:mysql://mysql/rundeck?autoReconnect=true&useSSL=false             
    volumes:
      -  /run/docker.sock:/var/run/docker.sock
      -  /home/ubuntu/.ssh:/home/rundeck/.ssh
      - ./rundeck_data:/home/rundeck/server/data
      - ./rundeck_config:/home/rundeck/server/config

容器启动后,查找位于容器内 /home/rundeck/server/config 的文件“rundeck-config.properties”。在第 42 行,我需要将值 30d(实际)更改为 0d。

任何帮助都将不胜感激!

答案1

您不需要sed在容器启动前运行。

如果你读完Rundeck Docker 镜像的文档,其中提到:

雷姆科用于从模板生成 Rundeck 配置文件。它支持不同的键/值源,例如 vault、etcd 和 dynamodb。所有配置后端都组合成一个统一的键空间。这允许将配置空间的各个部分存储在不同的后端中。默认配置使用环境变量。

这表明我们可以使用环境变量实现所需的配置,事实上,如果我们设置RUNDECK_API_TOKENS_DURATION_MAX0d......

version: '3.4'
services:
  mysql:
    image: docker.io/mariadb:10
    environment:
      MARIADB_ROOT_PASSWORD: secret
      MARIADB_DATABASE: rundeck
      MARIADB_USER: rundeck
      MARIADB_PASSWORD: rundeck

  rundeck:
    restart: on-failure
    build: .
    container_name: rundeck
    ports:
      - 4444:4440
    environment:
      RUNDECK_GRAILS_URL: http://localhost:4444
      RUNDECK_SERVER_FORWARDED: 'true'
      RUNDECK_DATABASE_DRIVER: org.mariadb.jdbc.Driver
      RUNDECK_DATABASE_USERNAME: rundeck
      RUNDECK_DATABASE_PASSWORD: rundeck
      RUNDECK_LOGLEVEL_DEFAULT: info
      RUNDECK_DATABASE_URL: jdbc:mysql://mysql/rundeck?autoReconnect=true&useSSL=false
      RUNDECK_API_TOKENS_DURATION_MAX: 0d
    volumes:
      - rundeck_data:/home/rundeck/server/data
      - rundeck_config:/home/rundeck/server/config

volumes:
  rundeck_data:
  rundeck_config:

那么结果rundeck-config.properties包含:

rundeck@f9b1ceaaff8e:~$ grep tokens.duration.max server/config/rundeck-config.properties
rundeck.api.tokens.duration.max=0d

在容器中,您可以在中找到模板源/etc/remco/templates。我能够通过检查来确定正确的环境变量名称/etc/remco/templates/rundeck-config.properties,其中包含:

rundeck.api.tokens.duration.max={{ getv("/rundeck/api/tokens/duration/max", "30d") }}

在上面的示例docker-compose.yaml文件中,还请注意,我已删除了links条目,该条目已被弃用很长时间。您的容器可以通过名称引用同一 Compose 文件中的其他容器,而无需使用links

相关内容