Dockerfile奇技淫巧

博主 2777 2021-05-20

最近在编写Dockerfile的时候遇到了一些问题,主要是Linux命令的一些问题

  1. 加sudo
    非常多的命令写在Dockerfile里面都可能要加sudo才能正确运行,比如mkdir创建新目录,echo xx >> ww.txt创建新文件,make,make install等等

  2. ENV和 RUN export
    由于Dockerfile中每提交一条指令,都会基于已有的中间容器创建一个新的容器,而RUN export ROOT_DIR="/your_root/dir"这样的命令只在运行该指令时拥有ROOT_DIR变量,到下一个中间容器就不存在了
    ENV指令维护的变量会存在于所有的中间容器中
    但是! 划重点:这些环境变量都会在真正后来docker run启动的容器中消失!例如配置PATH操作就不可以用上述命令进行

  3. 那么Dockerfile如何配置PATH呢
    Linux中很多环境变量配置文件,bashrc,bash_profile等等。可以在Dokcerfile中写 RUN echo xx >> ~/.bashrc的方式来追加需要添加的环境变量路径

  4. echo的字符串可能有双引号如何添加
    此时需要加入反斜杠
    例如

echo "export PATH=\"/usr/local/openssl/bin:$PATH\"" >> ~/.bashrc

值得一提的是,其他特殊字符例如$ '都需要加入反斜杠

  1. 不要使用RUN cd
    RUN cd /dir在Dockerfile中似乎不能正确切换工作目录,请使用WORKDIR /dir切换工作目录

此条不太对,后来发现原因了。Docker引擎是以一行一行的Dockerfile命令为单位进行中间镜像的构建,RUN cd xxx切换目录之前以WORKDIR设置的目录为工作目录,cd之后当个镜像工作目录已切换到cd的目标,使用&&一次性执行多条linux命令即可在cd的目录工作。在下一条dockerfile行执行时,又以WORKDIR的目录为工作目录了

  1. 更换ubuntu官方的apt源
    不更换可能有未知的问题,可能无法下载某些包。国内一般使用阿里源,注意需要根据具体的Linux系统版本(Ubuntu16和18是不同的)来设置源
    在本地编写好sources.list后
    使用ADD sources.list /etc/apt进行换源,在进行sudo apt-get update && sudo apt-get upgrade即可

  2. echo重定向到新文件,没有创建新文件权限的问题
    例如一条简单的创建指令echo "hello world" >> a.txt
    由于没有创建新文件的权限,会报permission denied的操作,在echo前加入sudo只能让echo具有sudo权限,新文件创建依旧没有sudo权限。
    使用tee命令来解决这个问题
    echo "hello world" | sudo tee /dir/a.txt
    tee从标准输入流中读取信息并写入到标准输出或者一个文件当中,这样来完成新文件的创建。

  3. Dockerfile对source命令调整
    直接使用RUN source /dir/bashrc会报source not found
    需要调整,使用RUN /bin/bash -c "source /dir/bashrc"

  4. Docker容器每次启动时环境变量配置问题
    容器启动时(docker start)会自动执行~/.bashrc,而不会执行~/.bash_profile/etc/profile等等脚本
    ~/.bashrc里面添加source ~/.bash_profile即可
    在Dockerfile中 echo "source ~/.bash_profile" >> ~/.bashrc