如何通过Docker Compose将仅数据Docker镜像挂载为卷供Nginx使用?
静态数据镜像与Nginx挂载方案
问题描述
我有一个可生成静态HTML文件的构建流程,构建完成后会将编译好的文件复制到一个新的Docker镜像中,镜像的Dockerfile内容如下:
FROM scratch COPY --from=build /src/build/web /app
现在我有一个Nginx服务,需要访问上述镜像中/app目录下的文件以提供静态资源服务。请问是否可以直接将这个仅存数据的镜像挂载为卷?
解答
不能直接把这个scratch数据镜像挂载为卷,Docker本身没有直接将整个镜像作为卷挂载的机制,而且scratch镜像没有任何操作系统工具,也没法支持卷挂载相关的操作。这里给你几个实用的替代方案:
方案一:直接整合到Nginx镜像(最推荐)
修改Nginx的Dockerfile,把数据镜像作为构建阶段,直接将静态文件复制到Nginx的默认静态资源目录:FROM nginx:alpine # 替换成你的数据镜像名称或ID COPY --from=static-web-image /app /usr/share/nginx/html构建这个镜像后,启动Nginx容器就能直接提供静态资源服务,流程简单且符合Docker最佳实践。
方案二:先把文件复制到宿主机再挂载
先通过临时容器把数据镜像里的文件导出到宿主机目录,再将该目录挂载给Nginx容器:# 将数据镜像里的/app内容复制到宿主机的/opt/static-web目录 docker run --rm -v /opt/static-web:/tmp/export static-web-image cp -r /app/* /tmp/export # 启动Nginx挂载该目录 docker run -d -p 80:80 -v /opt/static-web:/usr/share/nginx/html nginx:alpine方案三:用临时容器作为数据载体(旧特性)
启动一个基于数据镜像的后台容器,让Nginx通过--volumes-from挂载它的目录:# 启动一个长期运行的空容器承载数据 docker run -d --name static-data-holder static-web-image tail -f /dev/null # Nginx容器挂载该容器的/app目录到自身静态资源目录 docker run -d -p 80:80 --volumes-from static-data-holder -v /app:/usr/share/nginx/html nginx:alpine
内容的提问来源于stack exchange,提问作者fafre
相关产品推荐
相关产品推荐

