• Docker踩过的坑


    前言

    主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示

    正文

    Dockerfile里的RUN

    某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来.
    原来是把启动命令写在了 Dockerfile 的 RUN 里
    Dockerfile 的 RUN 命令只有在打包时才会用到
    Dockerfile 的 CMD 命令才是在镜像启动时执行,我们只需要将启动命令放在 CMD 里即可
    但是为了分开 (Dockerfile 只负责打包,执行由 Docker-compose ),我个人一般将启动命令放在 Docker-compose 的 command 里

    Docker 内部的服务不会更新

    某一次写了服务, 发现该服务有一个问题,修复后重新 go build 用 Docker 重新制作并测试
    使用 Docker-compose 进行测试(docker-compose up ),只有编译过后的二进制服务更新了, 其余没更新
    发现代码在 Docker 里没有更新(通过比对 md5 )
    Dockerfile 文件如下

    # 基础系统镜像
    FROM debian:stable-slim
    
    # 新建文件夹
    RUN mkdir /root/gophish
    
    # 设置工作目录
    WORKDIR /root/gophish
    
    # COPY当前目录所有文件到WORKDIR
    COPY . .
    
    # 设置执行权限并执行
    RUN chmod +x gophish
    
    # 注意:RUN后面的命令只有在构建镜像时执行,CMD才是启动时执行,也可以将启动写到DockerCompose中方便管理
    
    

    原因是在多次 build 时, 基础镜像 stable-slim 里有上一次编译的 gophish 二进制文件
    也就是说, mkdir 并不会执行, WORKDIR也不会执行, 走到 COPY 时, Docker没有检测到二进制文件 gophish 更新了,
    所以镜像内部的 gohish 一直是老得版本
    解决问题有多种方法, 比如把原来的镜像删除/COPY时不要一次全部COPY指定文件夹依次COPY等等,我是直接修改Dockerfile

    # 基础系统镜像
    FROM debian:stable-slim
    
    # 新建文件夹, 防止Docker识别不出文件改动,在COPY前先删除原有文件
    RUN rm -rf /root/gophish/ && mkdir /root/gophish
    
    # 设置工作目录
    WORKDIR /root/gophish
    
    # COPY当前目录所有文件到WORKDIR
    COPY . .
    
    # 设置执行权限并执行
    RUN chmod +x gophish
    
    # 注意:RUN后面的命令只有在构建镜像时执行,CMD才是启动时执行,也可以将启动写到DockerCompose中方便管理
    
    

    COPY 的艺术

    看到许多教程都建议 COPY . .
    也就是将本地文件夹所有文件都 COPY 到 Docker 中
    这种方式跟普通的一个文件夹一个文件夹的 COPY 相比, 虽然减少了几行命令, 但是也有其缺点
    就是会将所有文件都 COPY 比如 .git 文件夹等不需要 COPY 的文件夹和文件
    比如

    Docker-compose up 时代码不会更新

    如果在 docker-compose 中有

        image: xxx:1.0
        build: .
    

    这代表image不存在时才会 build
    如果存在老的版本你改动了代码也不会重新build
    解决方法是删除 xxx 的image 或者运行 docker-compose build

  • 相关阅读:
    HDU 5521 Meeting
    HDU 5170 GTY's math problem
    HDU 5531 Rebuild
    HDU 5534 Partial Tree
    HDU 4101 Ali and Baba
    HDU 5522 Numbers
    HDU 5523 Game
    ZUFE OJ 2301 GW I (3)
    POJ 2398 Toy Storage
    POJ 2318 TOYS
  • 原文地址:https://www.cnblogs.com/chnmig/p/12509437.html
Copyright © 2020-2023  润新知