docker - 启动nginx docker容器时如何替换文件的内容
问题描述
我想在通过 docker-compose 启动 docker nginx 容器时更改配置文件的内容。我将包含 sed 命令的脚本复制到“docker-entrypoint.d”目录,以便在启动时执行。注意:nginx 1.19 引入了一个入口点和一些脚本来更改容器启动时的配置。
但是,我遇到以下问题:
- 无论我将“env.js”放在哪个路径下,“sed”总是返回“没有这样的文件或目录”。我已经尝试过不同的路径。
- 如果在 Dockerfile 中设置了 "ENTRYPOINT ["nginx", "-g", "daemon off;"]",则位于 "docker-entrypoint.d" 中的初始化脚本将被忽略(不执行)。因此,在发布的 Dockerfile 中注释了 ENTRYPOINT。
以下是相关文件:
Dockerfile:
# 1.) build
FROM node:14.16.1-alpine3.13 AS builder
WORKDIR /app
COPY . .
# 2.) target image
FROM nginx:1.21.3-alpine
COPY --from=builder /app/myinit.sh ./docker-entrypoint.d
COPY --from=builder /app/env.js /usr/share/nginx/html
#ENTRYPOINT ["nginx", "-g", "daemon off;"]
myinit.sh:
sed -i 's~__env.apiUrlRoot.*~__env.apiUrlRoot = '$MYENV';~g' /usr/share/nginx/html/env.js
环境.js:
(function (window) {
window.__env.apiUrlRoot = 'http://localhost:9090';
}(this));
码头工人-compose.yml:
version: '3.8'
services:
mytest:
image: 'tst:latest'
build:
context: .
dockerfile: Dockerfile
container_name: tst1
environment:
- MYENV=SomeValue
码头工人撰写命令:
docker-compose -f docker-compose.yml up --build
解决方案
我找到了第一个问题的根本原因:“myinit.sh”包含 windows 样式 CRLF 而不是 unix 样式 LF。我改变了它并且shell脚本正确执行。顺便说一句:您可以运行“dos2unix”将 CRLF 替换为 LF。
推荐阅读
- c++ - 在一种情况下 shared_ptr 会导致运行时错误,在另一种情况下不会
- java - 如何在不显示打印对话框的情况下使用特定打印机(Microsoft Print to PDF)和特定文件名打印 JTable?
- android - okHttp 是 Android 的一部分吗?
- repast-simphony - 以编程方式运行 repast simphony 模型时无法读取输入文件
- game-maker - 在 Gamemaker 中进入房间时停止音频?
- kubernetes - Kubernetes:比较 Prometheus / PromQL 中 Pod 的 RSS 内存使用和 Pod 内存需求
- jquery - 如何使用 django 和 jquery 获取选中的单选按钮的值
- python - 如何从图像中提取签名(python脚本)?
- javascript - 即使我使用允许服务器上的所有来源,请求的资源上也没有“Access-Control-Allow-Origin”标头
- python - Python,在文本文件中捕获值