最近在编写Dockerfile的时候遇到了一些问题,主要是Linux命令的一些问题
-
加sudo
非常多的命令写在Dockerfile里面都可能要加sudo才能正确运行,比如mkdir创建新目录,echo xx >> ww.txt
创建新文件,make,make install等等 -
ENV和 RUN export
由于Dockerfile中每提交一条指令,都会基于已有的中间容器创建一个新的容器,而RUN export ROOT_DIR="/your_root/dir"
这样的命令只在运行该指令时拥有ROOT_DIR变量,到下一个中间容器就不存在了
ENV指令维护的变量会存在于所有的中间容器中
但是! 划重点:这些环境变量都会在真正后来docker run启动的容器中消失!例如配置PATH操作就不可以用上述命令进行 -
那么Dockerfile如何配置PATH呢
Linux中很多环境变量配置文件,bashrc,bash_profile等等。可以在Dokcerfile中写RUN echo xx >> ~/.bashrc
的方式来追加需要添加的环境变量路径 -
echo的字符串可能有双引号如何添加
此时需要加入反斜杠
例如
echo "export PATH=\"/usr/local/openssl/bin:$PATH\"" >> ~/.bashrc
值得一提的是,其他特殊字符例如$ '
都需要加入反斜杠
不要使用RUN cd
RUN cd /dir
在Dockerfile中似乎不能正确切换工作目录,请使用WORKDIR /dir
切换工作目录
此条不太对,后来发现原因了。Docker引擎是以一行一行的Dockerfile命令为单位进行中间镜像的构建,RUN cd xxx切换目录之前以WORKDIR设置的目录为工作目录,cd之后当个镜像工作目录已切换到cd的目标,使用&&一次性执行多条linux命令即可在cd的目录工作。在下一条dockerfile行执行时,又以WORKDIR的目录为工作目录了
-
更换ubuntu官方的apt源
不更换可能有未知的问题,可能无法下载某些包。国内一般使用阿里源,注意需要根据具体的Linux系统版本(Ubuntu16和18是不同的)来设置源
在本地编写好sources.list后
使用ADD sources.list /etc/apt
进行换源,在进行sudo apt-get update && sudo apt-get upgrade
即可 -
echo重定向到新文件,没有创建新文件权限的问题
例如一条简单的创建指令echo "hello world" >> a.txt
由于没有创建新文件的权限,会报permission denied的操作,在echo前加入sudo只能让echo具有sudo权限,新文件创建依旧没有sudo权限。
使用tee命令来解决这个问题
echo "hello world" | sudo tee /dir/a.txt
tee从标准输入流中读取信息并写入到标准输出或者一个文件当中,这样来完成新文件的创建。 -
Dockerfile对source命令调整
直接使用RUN source /dir/bashrc
会报source not found
需要调整,使用RUN /bin/bash -c "source /dir/bashrc"
-
Docker容器每次启动时环境变量配置问题
容器启动时(docker start)会自动执行~/.bashrc
,而不会执行~/.bash_profile
,/etc/profile
等等脚本
在~/.bashrc
里面添加source ~/.bash_profile
即可
在Dockerfile中echo "source ~/.bash_profile" >> ~/.bashrc
Comments | 0 条评论