前言

主要是记录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

Docker踩过的坑的更多相关文章

  1. Win7 安装 Docker 踩的那些坑

    公司电脑是 WIN7 x64 旗舰版 SP1,安装 Docker 时踩了好多雷,分享出来给大家排排雷. 首先,Docker Desktop Installer 的 Windows 版只支持 Win10 ...

  2. windows虚拟机下 安装docker 踩过的坑

    首先,你的是win7.8还是win10 windows对docker兼容也是最近的事,所以win7.8的话,安装docker是要用工具箱的,不过官方给了下载. 国内话的可以通过,阿里镜像,或者清华镜像 ...

  3. 使用docker踩过的坑(二)

    关于docker的部署,我这里不多说了 下面写一些最近经常用到的命令: docker下载镜像: docker pull 镜像名 docker查看已下载的所有镜像: docker images dock ...

  4. 使用docker踩过的坑

    最近需要使用docker,但是win10电脑的系统不是docker windows适用版本,没法在windows上安装 于是就上centos虚拟机里面装了一个docker docker pull文件的 ...

  5. docker部署redis及踩到的坑

    对docker很好奇,玩了一下,部署了一个redis,结果踩了很多坑 任务目的就是在docker中成功部署redis并保证数据持久化到本地,配置也使用本地配置 docker run -p : -v $ ...

  6. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  7. ASP.NET Web 应用 Docker踩坑历程——续

    ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...

  8. ASP.NET Web 应用 Docker踩坑历程

    听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项. 前两天扫了一眼<[大话云原生]煮饺子与docker.kubernetes之间的关系>,觉得有点 ...

  9. 可视化爬虫Portia安装和部署踩过的坑

    背景 Scrapy爬虫的确是好使好用,去过scrapinghub的官网浏览一下,更是赞叹可视化爬虫的犀利.scrapinghub有一系列的产品,开源了大部分项目,Portia负责可视化爬虫的编辑,Sp ...

随机推荐

  1. Java8新增的这些集合骚操作,你掌握了嘛?

    目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...

  2. 你来说一下springboot的启动时的一个自动装配过程吧

    前言 继续总结吧,没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看到spr ...

  3. docker redis 设置和使用

    1 开启docker 拉取redis镜像 1.1 桌面版docker   在镜像所在位置命令行执行 docker load -i redis.tar 1.2 开启redis docker run -p ...

  4. 实验楼表关系建立 (课程模块&#183;5张表)

    实验楼表关系图 from utils.MyBaseModel import Base from django.db import models # # Create your models here. ...

  5. Unity 自动烘培Cpu占用过高电脑卡死

    起因 打开Unity项目   发现右下方一直  

  6. Nginx(二):配置文件

    nginx.conf 配置文件   nginx 安装目录下,主配置文件 nginx.conf [root@localhost nginx]# cd /etc/nginx/ [root@localhos ...

  7. vscode php转到定义

    点击再settings.json 中编辑 添加这一行,内容为php的安装路径

  8. exp(cos(t)) - 2*cos(4.*t) + (sin(t./12)).^5;图形

    clc; clear all; close all; t = linspace(0,24*pi,1000); r = exp(cos(t)) - 2*cos(4.*t) + (sin(t./12)). ...

  9. ADF 第六篇:Copy Data Activity详解

    在Azure 数据工程中,可以使用Copy Data 活动把数据从on-premises 或云中复制到其他存储中.Copy Data 活动必须在一个IR(Integration Runtime)上运行 ...

  10. EF中使用UnitOfWork

    前言 关于EF5中使用UnitWork,参见另一博文:  https://www.cnblogs.com/masonblog/p/9801162.html 每次提交数据库都会打开一个连接,造成结果是: ...