docker - 带有自定义父映像的 Dockerfile
问题描述
如何使用现有图像作为FROM
dockerfile 中的参数?
我正在尝试对 VueJS 应用程序进行 docker 化,但希望pierrezemb/gostatic作为基础映像——它是一个小型 http 服务器,原则上能够托管文件和目录。但是,当运行完成的图像并在浏览器中检查暴露的端口时,index.html
文件会加载,但子文件夹 404 中的所有其他资源都会失败,并显示:
The resource from “http://localhost:8043/js/app.545bfbc1.js” was blocked due to MIME type (“text/plain”) mismatch (X-Content-Type-Options: nosniff)
. 卷曲资源仅返回 404。
这可能是因为 gostatic 基础镜像被创建为非常独立的,而不是作为FROM
参数包含在 Dockerfile 中。当我自己构建代码并使用 gostatic 托管目录时,一切都很好。当我使用 Dockerfile 构建时,构建成功,但在尝试获取不在主目录中的资源时出现上述错误。
理想的独立用例:
docker run -d -p 80:8043 -v path/to/website:/srv/http --name goStatic pierrezemb/gostatic
当前的 Dockerfile
FROM pierrezemb/gostatic AS deployment
COPY ./dist/* /srv/http/
EXPOSE 8043
# Note, gostatic calls: ENTRYPOINT ["/goStatic"]
# Therefore CMD need only be goStatic parameters
CMD ["-enable-health", "-enable-logging"]
请注意, dist 文件夹已构建并正常运行。同样值得注意的是,健康端点不起作用,并且没有日志记录(为其设置了标志)。很明显我处理错误的父图像
我正在使用以下命令构建和运行:
docker build -t tweet-dash .
docker run -d -p 8043:8043 --name dash tweet-dash
goStatic 的 Dockerfile 在这里
解决方案
这实际上几乎正是您应该使用现有图像的方式:这里的一切都正确完成。
对于那些后来者;注意父基础镜像的 Dockerfile——在你旁边打开它来构建你自己的。弄清楚如何单独使用图像,首先作为独立的,然后看看是否可以添加到它。
在这种情况下 Dockerfile 稍微不正确:当您使用 复制文件目录时COPY ./dist/* /srv/http
,docker 将递归遍历文件结构并将每个单独的文件添加到/srv/http
. 不会保留任何文件夹。
这可以通过做来解决COPY ./dist /srv/http
。
推荐阅读
- reactjs - 反应中的切换状态工作正常,但我的功能检查不正确
- oracle - 从动态 SQL 访问记录类型的表
- docker - GKE集群创建时如何为节点使用自定义Ubuntu镜像?
- javascript - ExpressJS RESTapi 动态设置路由
- ruby - 如何将文件夹引用添加到 PBXGroup?
- bash - 尝试 grep 时出现错误“期望:生成 id exp4 未打开”
- excel - Excel VBA 应用程序总和
- c++ - 是什么导致我的“命名空间'Foam'中的'FatalError'没有命名类型”错误?
- ios - 仅从日期数组中删除时间 Swift
- javascript - 即使应用了我在网上可以找到的所有方法,我的页面也没有滚动