簡體   English   中英

無法更改 nginx.conf 文件

[英]Unable to change nginx.conf file

我有一個運行 CentOS6.7 的流浪箱,我正在運行 docker 容器。 我打算在容器內運行由 nginx 服務的 Flask 應用程序。 我必須在 nginx.conf 文件中進行某些更改才能通過 nginx 為我的應用程序 (app1) 提供服務。 這可能看起來有點奇怪,但我無法更改 /etc/nginx/conf.d/nginx.conf 中的 nginx.conf 文件

這是我所做的:

方法一:更改Dockerfile

我的 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提交

在 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:

Dockerfile 參考

Dockerfile 最佳實踐

通過 Docker dockerize PostreSQL 的便捷教程

我建議您將配置文件放在一個卷中,這樣您就可以在主機上編輯該文件,並且它也會在容器內進行更改。

為此,您可以使用以下命令運行容器

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM