• 将blog发布到docker中


    费了点劲,总算是能在容器里运行这个Blogifier了。(补充:这边文章转载的原来博客的文章)

    先记录一下最后使用的方式,然后附上碰到的问题和一些想法。

    构造记录

    构造文件环境

    1. 创建一个空目录作为docker的基础目录
    2. 进入到该目录,然后将博客项目克隆到其中,假定目录名称为Blogifier

    构建docker镜像

    在同一目录层级创建Dockerfile,Dockerfile文件内容如下:

      ```docker
      # 首先使用构建镜像构建
      FROM microsoft/dotnet:sdk AS build-env
      WORKDIR /app
      ARG appdir=Blogifier
    
      # 拷贝所有程序文件到中间镜像中,恢复所需的库
      COPY $appdir/ ./
      RUN dotnet restore
    
      # 发布生成镜像
      RUN dotnet publish -c Release -o out
    
      # 通过构建镜像生成运行镜像
      FROM microsoft/dotnet:aspnetcore-runtime
      WORKDIR /app
      COPY --from=build-env /app/src/App/out .
      COPY --from=build-env /app/plugins/Common/out/ .
      COPY --from=build-env /app/src/Upgrade/out/ .
      ENTRYPOINT ["dotnet", "App.dll"]
    
      ```
    

    这里有几个碰到的问题

    1. 如果不从microsoft/dotnet:sdk镜像构建,而是直接在机器上构建然后拷贝到docker镜像中,会找不到sqlite的库。怀疑是不同的环境依赖不同造成的
    2. 这个blogifier的目录结构相对复杂,拷贝时注意拷贝文件的目录结构。而且Common.dll这个库虽然依赖,但是发布缺没有拷贝进去,这应该是代码问题

    执行如下命令构建docker镜像:

    ```shell
    docker build  -t myblog .
    ```
    

    运行docker镜像

    这里将log文件,数据库文件和data文件都挂在成了volumn,这样在容器外也能看到。

    ```shell
    docker run -d -p 8000:80 --name myblog 
     --mount source=blogdb,target=/data 
     --mount source=blogdata,target=/app/wwwroot/data 
     --mount source=bloglog,target=/app/Logs 
     myblog
    ```
    

    由于我的虚拟机开放了8000端口,所以也做了端口映射

    问题记录

    调试文件结构

    一开始dotnet运行总是报错,而且提示不友好,怀疑是里面的文件不对,所以想打印docker镜像文件结构。

    费了点功夫,发现两个方发

    1. 在dockerfile中,想要的地方,通过RUN ls指令打印
    2. 镜像已经构造好后,如果是ENTRYPOINT方式(我的dockerfile就是),可以通过docker run --entrypoint ls myblog这样的方式,修改image入口,执行ls

    dockerfile运行目录

    一开始以为dockerfile的copy命令能够拷贝host上的任意文件到image中,后来才了解到,只有当前目录(或者说PATH目录,实际上好像就是当前目录)里的内容,能被找到。

    这是因为docker执行build命令时,会先将当前环境文件发送给docker的实际服务,其他目录的内容build服务是找不到的。

    arg的用法

    一开始我是想把外部编译好的文件,直接copy到image中(后来发现这样找不到库,还是要在微软的image里编译才行),想利用ARG传入拷贝的目录。结果每次都拷贝不到。

    后来发现除了上面说的dockerfile的运行目录问题,还有个问题是ARG的作用域是从ARG定义的参数,到下一个FROM为止,不能跨越FROM。

    所以每个FROM想要使用ARG,需要再声明一下ARG。

    补充一个检查已经运行的docker镜像的方发

    docker attach [container]的确可以,但是对于我这种占用控制台的单进程情况,就什么页看不到,而且一不小心ctrl+c,连container都杀死了

    SO上看到一个方发:

    docker exec -t -i {container name } {command to exe}
    

    这样就可以轻松执行ls等命令了

  • 相关阅读:
    51单片机学习笔记(清翔版)(23)——红外通讯
    51单片机学习笔记(清翔版)(22)——数字温度传感器DS18B20
    信号与系统1.1.4信号的分类-信号的MATLAB的表示与绘图
    信号与系统1.1.3信号的分类-能量与功率信号,因果与反因果
    信号与系统1.1.2信号的分类-周期与非周期
    信号与系统1.1.1信号的分类-确定与随机-离散与连续
    51单片机学习笔记(清翔版)(21)——ADDA数模转换
    51单片机学习笔记(清翔版)(19)——串口通信
    ecplise问题总结
    Android广播机制(转)
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12608262.html
Copyright © 2020-2023  润新知