[英]Unable to change nginx.conf file
我有一個運行 CentOS6.7 的流浪箱,我正在運行 docker 容器。 我打算在容器內運行由 nginx 服務的 Flask 應用程序。 我必須在 nginx.conf 文件中進行某些更改才能通過 nginx 為我的應用程序 (app1) 提供服務。 這可能看起來有點奇怪,但我無法更改 /etc/nginx/conf.d/nginx.conf 中的 nginx.conf 文件
這是我所做的:
我的 Dockerfile 看起來像這樣:
FROM tiangolo/uwsgi-nginx-flask:flask
COPY ./app /app
COPY ./changes/nginx.conf /etc/nginx/conf.d/nginx.conf
COPY ./changes/nginx.conf /app/
./changes/nginx.conf 看起來像這樣:
server {
location /app1/ {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
location /static {
alias /app/static;
}
}
注意上面服務器塊中的位置從location /
到location /app1/
構建映像並運行 docker 容器后,我 exec 進入正在運行的容器
sudo docker exec -ti CONTAINER_ID /bin/bash
cat /app/nginx.conf
顯示更新的 nginx.conf 文件的存在(位置從/
更改為/app1/
但是cat /etc/nginx/conf.d/nginx.conf
仍然顯示舊的 conf 文件(位置仍然是/
)我想也許第二行 COPY 沒有成功執行並且 docker 沒有在控制台上拋出錯誤(sudo? )。 因此,我手動更改了 conf 文件並進行了 docker commit - 下面提到的第二種方法。
在 docker 容器啟動並運行后,我使用 exec 登錄到容器中
[vagrant@localhost]$ sudo docker exec -ti CONTAINER_ID /bin/bash
[root@CONTAINER_ID]# vi /etc/nginx/conf.d/nginx.conf
更改文件以反映以下內容:
server {
location /app1/ {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
location /static {
alias /app/static;
}
}
保存文件wq!
並退出容器。 之后我做了sudo docker commit CONTAINER_ID my_new_image
啟動一個新容器並重新登錄到在 my_new_image 上運行的容器仍然會在 /etc/nginx/conf.d/nginx.conf 中提供以下 nginx.conf 文件:
server {
location / {
try_files $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
location /static {
alias /app/static;
}
}
我可以說 my_new_image 有一些變化,因為它的大小比 tiangolo/uwsgi-nginx-flask-docker 大,因為我已經安裝了 vim 來編輯文件。 但不知何故,文件更改並沒有保留在 /etc/nginx/conf.d/nginx.conf 中
我究竟做錯了什么?
更新Github 倉庫: https : //github.com/VimanyuAgg/flask-nginx.git
事實證明,父圖像已經將特定文件添加到圖像中,該文件是只讀的。 這意味着您很遺憾無法更改或覆蓋文件。
一個hacky解決方案是將/etc/nginx/conf.d
文件夾掛載到主機上的目錄中(假設/usr/local/share/nginxconf
)並在那里更改文件,該文件位於另一個命名空間和不同的權限中(afaik)。 它對我有用。
docker create -v /usr/local/share/nginxconf:/etc/nginx/conf.d --name flask-test IMAGE_NAME
vim /usr/local/share/nginxconf/nginx.conf
另一個更高級的解決方案是使用另一個父圖像,它不會事先添加文件。 但是我不知道您的應用程序需要哪些依賴項,因此搜索可能會很痛苦。 您當然也可以創建自己的(這也可以為您提供一些編寫 Dockerfile 的培訓)。
參考編寫一個成功的 Dockerfile:
我建議您將配置文件放在一個卷中,這樣您就可以在主機上編輯該文件,並且它也會在容器內進行更改。
為此,您可以使用以下命令運行容器
docker run -d -v /path/to/changes/nginx.conf:/etc/nginx/conf.d/nginx.conf IMAGE_NAME
更改配置后,不要忘記測試並應用配置
docker exec -ti CONTAINER_NAME /bin/sh -c "nginx -t && nginx -s reload"
另外我建議你不要在鏡像中安裝 vim,因為鏡像應該是輕量級的,並且應該避免安裝不必要的包
目前,我使用相同的圖像通過 django 部署應用程序。 這個鏡像有一個在容器啟動時執行的腳本。
我的解決方案是使用我的自定義配置 nginx.conf 創建一個新文件,然后修改腳本 prestart.sh 添加新行進行復制並替換 /etc/conf.d/nginx.conf 中的默認文件
create new custom file /mypath/file_Custom_nginx.conf
然后在腳本 prestart.sh 中添加新行
cp /mypath/file_Custom_nginx.conf /etc/conf.d/nginx.conf
重啟容器。
現在每次重新啟動腳本都會替換文件配置 nginx。
注意:我使用supervisord來管理nginx服務
我希望它可以幫助你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.