如何在启动已安装卷的 docker 容器后保留已编译的文件?
How to keep compiled files after starting a docker container with volume mounted?
我有一个多阶段构建的镜像,用于编译一些文件并将它们复制到我的最终镜像中。
我还在主机上的应用程序目录和容器内部之间设置了一个卷。
但是当我启动容器时,编译的文件不在这里。据我了解卷是如何工作的,它非常有意义:容器用主机上目录的内容替换他的目录的内容,编译文件不会生成,因为它们是由容器在构建时生成的。
但我想知道是否有一种方法可以在容器启动时保留音量并将编译后的文件放入容器中。我认为我做错了。
为了向您提供有关我的需求的更多信息,我想在 nodejs 映像中从 .scss
编译 .css
文件,并将编译后的 .css
复制到 /app/<my_app>/static/css/
我的应用程序的文件夹 docker 图片。
这是我的项目结构:
- 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
Docker 文件
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
中的 WORKDIR /app
假设在 python:alpine
构建步骤中 /app
存在(或创建),因为构建映像。看起来这在 Dockerfile
中创建为空,随后的 COPY /app .
什么都不做。
/app
卷挂载在映像构建完成后用于创建容器时应用。
最后我自己找到了解决办法,所以我post这里的答案希望它能帮助别人。
我放弃了 multi-stage 构建并尝试创建一个专用于 scss 编译的图像。
这是这张图片的Dockerfile
:
FROM node:alpine
WORKDIR /build
COPY package.json ./
RUN mkdir -p ./scss ./css
RUN npm install
CMD npm run scss
请注意,我在nodejs环境中使用模块node-sass编译scss。
目前,它只是从 scss/
编译文件并将输出放入 css/
。但是这些文件夹中还没有任何内容。
我在开始时将我的 docker-compose.yml
编辑为 运行 这个新图像,并将我应用程序的静态文件夹中的两个卷设置到容器中的 scss/
和 css/
文件夹这张名为 scss
的新图片的一部分。因此,当 web
启动时,static/css
将由此新服务使用来自 static/scss
的文件作为源来填充。
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
图像的容器不是 运行ning,因为它是一个 one-shot 命令,不是一个适当的服务 运行ning,但你可以 运行 再一次,如果您对 .scss
文件做了一些更改,您想要再次编译 .css
。
我有一个多阶段构建的镜像,用于编译一些文件并将它们复制到我的最终镜像中。
我还在主机上的应用程序目录和容器内部之间设置了一个卷。
但是当我启动容器时,编译的文件不在这里。据我了解卷是如何工作的,它非常有意义:容器用主机上目录的内容替换他的目录的内容,编译文件不会生成,因为它们是由容器在构建时生成的。
但我想知道是否有一种方法可以在容器启动时保留音量并将编译后的文件放入容器中。我认为我做错了。
为了向您提供有关我的需求的更多信息,我想在 nodejs 映像中从 .scss
编译 .css
文件,并将编译后的 .css
复制到 /app/<my_app>/static/css/
我的应用程序的文件夹 docker 图片。
这是我的项目结构:
- 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
Docker 文件
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
中的 WORKDIR /app
假设在 python:alpine
构建步骤中 /app
存在(或创建),因为构建映像。看起来这在 Dockerfile
中创建为空,随后的 COPY /app .
什么都不做。
/app
卷挂载在映像构建完成后用于创建容器时应用。
最后我自己找到了解决办法,所以我post这里的答案希望它能帮助别人。
我放弃了 multi-stage 构建并尝试创建一个专用于 scss 编译的图像。
这是这张图片的Dockerfile
:
FROM node:alpine
WORKDIR /build
COPY package.json ./
RUN mkdir -p ./scss ./css
RUN npm install
CMD npm run scss
请注意,我在nodejs环境中使用模块node-sass编译scss。
目前,它只是从 scss/
编译文件并将输出放入 css/
。但是这些文件夹中还没有任何内容。
我在开始时将我的 docker-compose.yml
编辑为 运行 这个新图像,并将我应用程序的静态文件夹中的两个卷设置到容器中的 scss/
和 css/
文件夹这张名为 scss
的新图片的一部分。因此,当 web
启动时,static/css
将由此新服务使用来自 static/scss
的文件作为源来填充。
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
图像的容器不是 运行ning,因为它是一个 one-shot 命令,不是一个适当的服务 运行ning,但你可以 运行 再一次,如果您对 .scss
文件做了一些更改,您想要再次编译 .css
。