Docker构建映像-无法CD进入目录并运行命令

时间:2018-12-30 14:26:40

标签: image docker build cd

Docker版本:17.09.1-ce 我是Docker的初学者,我正在尝试在centos上构建docker映像。以下是我所拥有的docker文件的片段

FROM centos
RUN yum -y install samba-common && \
yum -y install gcc perl mingw-binutils-generic mingw-filesystem-base mingw32-binutils mingw32-cpp mingw32-crt mingw32-filesystem mingw32-gcc mingw32-headers mingw64-binutils mingw64-cpp mingw64-crt mingw64-filesystem mingw64-gcc mingw64-headers libcom_err-devel popt-devel zlib-devel zlib-static glibc-devel glibc-static python-devel && \
yum -y install git gnutls-devel libacl1-dev libacl-devel libldap2-dev openldap-devel && \
yum -y remove libbsd-devel && \
WORKDIR /usr/src && \
git clone git://xxxxxxxx/p/winexe/winexe-waf winexe-winexe-wafgit && \
WORKDIR /usr/src/samba && \
WORKDIR /usr/src/winexe-winexe-wafgit/source && \
head -n -3 wscript_build > tmp.txt && cp -f tmp.txt wscript_build && \
echo -e '\t'"stlib='smb_static bsd z resolv rt'", >> wscript_build && \
echo -e '\t'"lib='dl gnutls'", >> wscript_build && \
echo -e '\t'")" >> wscript_build && \
rm -rf tmp.txt && \
./waf --samba-dir=../../samba configure build

我尝试了不起作用的普通cdWORKDIR不起作用。如何在Dockerfile中设置工作目录?

使用上面的Dockerfile

时,我收到如下错误
/bin/sh: WORKDIR: command not found
The command '/bin/sh -c yum -y install samba-common &&     yum -y install gcc perl mingw-binutils-generic mingw-filesystem-base mingw32-binutils mingw32-cpp mingw32-crt mingw32-filesystem mingw32-gcc mingw32-headers mingw64-binutils mingw64-cpp mingw64-crt mingw64-filesystem mingw64-gcc mingw64-headers libcom_err-devel popt-devel zlib-devel zlib-static glibc-devel glibc-static python-devel &&     yum -y install git gnutls-devel libacl1-dev libacl-devel libldap2-dev openldap-devel &&     yum -y remove libbsd-devel && WORKDIR /usr/src &&     git clone git://xxxxxxxx/p/winexe/winexe-waf winexe-winexe-wafgit &&     WORKDIR /usr/src/samba &&     git reset --hard a6bda1f2bc85779feb9680bc74821da5ccd401c5 && WORKDIR /usr/src/winexe-winexe-wafgit/source &&     head -n -3 wscript_build > tmp.txt && cp -f tmp.txt wscript_build &&     echo -e '\t'"stlib='smb_static bsd z resolv rt'", >> wscript_build &&     echo -e '\t'"lib='dl gnutls'", >> wscript_build &&     echo -e '\t'")" >> wscript_build &&     rm -rf tmp.txt &&     ./waf --samba-dir=../../samba configure build' returned a non-zero code: 127

当我尝试使用普通的cd代替工作WORKDIR时,出现以下错误 /bin/sh: line 0: cd: /usr/src/samba: No such file or directory,但可以使用sudo进入。然后,我尝试将sudo cd目录包括在docker文件中,然后显示no sudo found

更新1: 这就是我开始构建的方式 sudo docker build -t abwinexeimage -f ./abwinexeimage .构建成功,但不幸的是,当我列出图像时,我看不到任何带有namwin标记为abwinexeimage的图像。

enter image description here

我不明白什么是第一个标签名称为no的条目。它代表什么?它显示的大小为1.23 GB,我真的需要这张图片还是可以安全删除?

当我开始构建时,第一行显示Sending build context to Docker daemon 303.9MB意味着在该图像列表存储库中名为centos且标签名称为last的存储库是我构建的正确图像吗?我假设大小为202 MB?

然后我发布了docker ps,但是没有运行容器,然后发布了docker ps -a以查看已停止的容器 enter image description here

然后我尝试将图像作为容器运行。

enter image description here

现在试图发布docker ps来检查容器是否正在运行

enter image description here

现在我可以告诉您为什么我如此担心存在的多个容器。实际上,我想手动将CD放入docker容器中的cd / usr / src / samba中,以验证通过docker文件所做的更改是否正确更新。现在,由于我有多个容器,真的不确定我需要研究哪个容器。在这种特技中,我尝试启动所有容器,然后手动发布 docker exec -it CONTAINER_NAME [bash | sh]验证我是否能够在此处找到该文件系统。这就是为什么我问我是否可以拥有一个容器以便可以轻松地在其中找到文件系统的原因,我的理解是由于多个RUN语句创建了不同的层,所以我很难找到我的文件系统驻留在哪个容器中,这样我就可以CD了。.抱歉给我很大的解释...我试图更好地理解概念。请发表您的评论。

1 个答案:

答案 0 :(得分:0)

您需要将WORKDIR用作Dockerfile指令,而不是与run指令一起使用。

运行有2种形式:

  
      
  • RUN(shell形式,命令在shell中运行,在Linux上默认为/ bin / sh -c,在Windows上默认为cmd / S / C)RUN

  •   
  • [“可执行文件”,“ param1”,“ param2”](执行表单)

  •   

WORKDIR

  

WORKDIR / path / to / workdir WORKDIR指令设置工作   任何RUN,CMD,ENTRYPOINT,COPY和ADD指令的目录   在Dockerfile中关注它

FROM centos
RUN yum -y install samba-common && \
yum -y install gcc perl mingw-binutils-generic mingw-filesystem-base mingw32-binutils mingw32-cpp mingw32-crt mingw32-filesystem mingw32-gcc mingw32-headers mingw64-binutils mingw64-cpp mingw64-crt mingw64-filesystem mingw64-gcc mingw64-headers libcom_err-devel popt-devel zlib-devel zlib-static glibc-devel glibc-static python-devel && \
yum -y install git gnutls-devel libacl1-dev libacl-devel libldap2-dev openldap-devel && \
yum -y remove libbsd-devel

WORKDIR /usr/src 

#use git clone with RUN not with WORKDIR
RUN git clone git://xxxxxxxx/p/winexe/winexe-waf winexe-winexe-wafgit

#So start it with new line

WORKDIR /usr/src/samba
WORKDIR /usr/src/winexe-winexe-wafgit/source 

#start RUN with new line 

RUN head -n -3 wscript_build > tmp.txt && cp -f tmp.txt wscript_build && \
echo -e '\t'"stlib='smb_static bsd z resolv rt'", >> wscript_build && \
echo -e '\t'"lib='dl gnutls'", >> wscript_build && \
echo -e '\t'")" >> wscript_build && \
rm -rf tmp.txt && \
./waf --samba-dir=../../samba configure build