[英]Sharing precompiled assets across docker containers
我有一個與我的rails容器分開的nginx容器,並且希望能夠使用nginx容器從rails提供預編譯資產。 這聽起來像卷容器的工作,但我很快就需要學習docker並無休止地閱讀文檔。 有人不得不處理類似的情況嗎?
我有同樣的問題。 這是我目前正在做的事情:
這樣,我可以構建一次圖像(使用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
不漂亮,但很容易設置和升級。
共享卷無法在構建過程中更新,但可以由容器實例更新。 因此,我們可以運行我們的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
這看起來像一個更強大的選項,但需要更復雜的儀器。 但是,我傾向於這個選項,因為無論如何我們都需要一個單獨的數據庫遷移工作。
您的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是正確的:您應該將編譯后的資產添加到圖像中。 但是,為了發展,我認為你是對的。 使用以下使用的卷容器:
另一種方法是將主機目錄安裝到容器中。
您可以在“ 管理容器數據用戶指南”中找到更多幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.