![Docker 在容器启动前运行 SED 命令](https://linux22.com/image/779780/Docker%20%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%90%AF%E5%8A%A8%E5%89%8D%E8%BF%90%E8%A1%8C%20SED%20%E5%91%BD%E4%BB%A4.png)
我正在使用 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_MAX
为0d
......
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
。