繁体   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