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

Docker Build Image -- cant cd into directory and run commands

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

我用普通的 cd 试过了,但没用。 WORKDIR 不起作用。如何在 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 我可以进入它。然后我试图在 docker 文件中包含 sudo cd 目录然后它说 no sudo found

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

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

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

然后我发出dockerps,但是没有容器运行ning,然后发出dockerps -a 来查看停止的容器

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

现在尝试发出 docker ps 来检查容器是否 运行ning

现在我可以告诉你为什么我如此担心存在多个容器。实际上我想在 docker 容器中手动将 CD 放入 cd /usr/src/samba 以验证通过 docker 文件所做的更改是否已正确更新。现在因为我有多个容器,真的不确定我需要查看哪个容器。在那次特技表演中,我尝试启动所有容器,然后手动发出 docker exec -it CONTAINER_NAME [bash | sh] 验证我是否能够在那里找到该文件系统。这就是为什么我问我是否可以有一个容器以便我可以在那里轻松找到文件系统的原因,我的理解是因为多个 运行 语句创建了不同的层,所以我很难找到我在哪个容器中文件系统驻留,以便我可以 CD 进入它.. 抱歉解释太多......我试图更好地理解概念。请您发表意见..

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

运行 有两种形式:

  • RUN (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows) RUN

  • ["executable", "param1", "param2"] (exec form)

WORKDIR

WORKDIR /path/to/workdir The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the 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