簡體   English   中英

跨Docker容器共享預編譯資產

[英]Sharing precompiled assets across docker containers

我有一個與我的rails容器分開的nginx容器,並且希望能夠使用nginx容器從rails提供預編譯資產。 這聽起來像卷容器的工作,但我很快就需要學習docker並無休止地閱讀文檔。 有人不得不處理類似的情況嗎?

我有同樣的問題。 這是我目前正在做的事情:

選項1:對nginx和app使用單個圖像

這樣,我可以構建一次圖像(使用app,預編譯資產和nginx),然后運行它的兩個實例:一個運行app服務器,另一個運行nginx前端:

docker build -t hello .
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app hello nginx

不漂亮,但很容易設置和升級。

選項2:使用共享卷,並將資產預編譯為作業

共享卷無法在構建過程中更新,但可以由容器實例更新。 因此,我們可以運行我們的rake任務,在運行我們的應用程序之前預先編譯資產:

docker build -t hello .
docker run -v /apps/hello/assets:/app/public/assets hello rake assets:precompile
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app -v /apps/hello/assets:/usr/share/nginx/html/assets nginx

這看起來像一個更強大的選項,但需要更復雜的儀器。 但是,我傾向於這個選項,因為無論如何我們都需要一個單獨的數據庫遷移工作。

選項3:在構建時將資產分配給CDN

您的Dockerfile可以將生成的資產直接上傳到CDN。 然后配置Rails應用程序以將其用作asset_host 就像是:

RUN rake assets:precompile && aws s3 sync public/assets s3://test-assets/

我正在嘗試這個選項。 由於我使用的是Amazon CloudFront,看起來我可以使用AWS CLI將生成的資產同步到S3。 還有一個寶石( asset_sync ),但它看起來很陳舊。

缺點是您必須將所需的AWS憑證發送到構建上下文或Dockerfile本身 - 如果您使用的是自動構建,則可能需要將它們提交到源存儲庫。

我建議在Docker容器中預編譯資源,因為在這種情況下你可以毫無問題地將它運行到任何環境,否則在運行docker容器之前你應該將共享的預編譯資產復制到新環境,只有在它運行docker容器之后才能掛載它們。

另一個問題與資產版本有關。 我的意思是你的代碼必須使用與它兼容的資產,否則你將遇到CSS和JS的不同問題。 所以,這是你應該在Docker容器中預編譯資產的第二點。

對於生產,@ max是正確的:您應該將編譯后的資產添加到圖像中。 但是,為了發展,我認為你是對的。 使用以下使用的卷容器:

  • 用於存儲預編譯資產的rails容器
  • 用於提供資產的nginx容器

另一種方法是將主機目錄安裝到容器中。

您可以在“ 管理容器數據用戶指南”中找到更多幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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