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

原文地址:https://www.cnblogs.com/chnmig/p/12509437.html