簡體   English   中英

啟動 docker 容器並安裝卷后如何保留編譯文件?

[英]How to keep compiled files after starting a docker container with volume mounted?

我有一個多階段構建的圖像,用於編譯一些文件並將它們復制到我的最終圖像中。

我還在主機上的應用程序目錄和容器內設置了一個卷。

但是當我啟動容器時,編譯的文件不在這里。 據我了解卷是如何工作的,它非常有意義:容器用主機上目錄的內容替換他的目錄的內容,編譯文件不會生成,因為它們是由容器在構建時生成的。

但是我想知道是否有一種方法可以在容器啟動時保持音量並將編譯后的文件放在容器中。 我認為我做錯了。

為了向您提供有關我的需求的更多信息,我想從.scss圖像中的 .scss 編譯.css文件,並將編譯后的.css復制到我的應用程序 docker 圖像的/app/<my_app>/static/css/文件夾中。

這是我的項目結構:

- docker-compose.yml
- production.env
- web/
- - Dockerfile
- - build/
- - - scss/
- - app/
- - - <my_app>/
- - - - static/
- - - - - css/

docker-compose.yml

version: '3'

services:
  web:
    build: web/
    ports:
      - "5000:5000"
    env_file: 
      - ./production.env
    volumes:
      - ./web/app:/app

Dockerfile

FROM node:alpine as builder

WORKDIR /build

COPY build/ .

RUN npm install && mkdir -p css

RUN npm run scss # Compile .scss files to .css into /build/css/ folder

FROM python:alpine

WORKDIR /app

COPY app/ .

COPY --from=builder /build/css ./<my_app>/static/css

/* ... Some instructions ... */

CMD flask run

在這里,當我構建容器時,css 文件還不存在,它們被編譯,復制到最終圖像。 當我啟動圖像時,由於./web/app:/app 之間有一個卷,圖像的內容被主機中的內容替換,因此缺少.css 文件。

卷安裝僅在運行時發生; 在構建Dockerfile之后。

在構建容器映像時,卷安裝不會應用於容器映像。

Dockerfile中的 eg WORKDIR /app假設在構建映像時python:alpine構建步驟中存在(或創建) /app 看起來這是在Dockerfile和隨后的COPY /app. 什么也沒做。

/app volume mount 會在鏡像構建完成后用於創建容器時應用。

最后我自己找到了解決方案,所以我把答案貼在這里希望它能幫助別人。

我放棄了多階段構建並嘗試創建一個專門用於 scss 編譯的圖像。

這是這張圖片的Dockerfile

FROM node:alpine

WORKDIR /build

COPY package.json ./

RUN mkdir -p ./scss ./css

RUN npm install

CMD npm run scss

請注意,我使用模塊 node-sass 在 nodejs 環境中編譯 scss。

現在,它只是從scss/編譯文件並將 output 放入css/ 但是這些文件夾中還沒有任何內容。

我編輯我的docker-compose.yml以在開始時運行這個新圖像,並將我應用程序的 static 文件夾中的兩個卷設置到這個名為scss的新圖像容器中的scss/css/文件夾。 因此,當web啟動時,這個新服務將使用static/scss中的文件作為源來填充static/css

version: '3'

services:
  web:
    build: web/
    ports:
      - "5000:5000"
    depends_on:
      - scss
    env_file: 
      - ./production.env
    volumes:
      - ./web/app:/app
  scss:
    build: scss/
    env_file:
      - ./production.env
    volumes:
      - ./web/app/<my_app>/static/css:/build/css
      - ./web/app/<my_app>/static/scss:/build/scss  

最后,它起作用了。

運行$ docker-compose up -d后,這里有 css 個文件。 scss圖像的容器沒有運行,因為它是一個一次性命令,而不是一個正確的服務運行,但是如果你對你的.scss文件做了一些更改並且你想再次編譯.css ,你可以再次運行它。

暫無
暫無

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

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