触摸命令不影响 Docker 镜像

时间:2021-05-25 09:38:09

标签: docker dockerfile touch

我正在尝试在 Docker 镜像中创建一个基本的测试文件,如下所示;

FROM alpine as build

RUN cd /opt/bin/ && touch test123
CMD echo "Hello world" 


EXPOSE 9005
EXPOSE 9006

所以图像创建成功。 但是当我在部署到本地 Kubernetes 后登录镜像时,“kubectl exec -it”,我在镜像中没有看到这个“test123”文件。 >

我还添加了“ADD /tmp/test/ /opt/”命令,但这也给出了如下所示的错误。服务器上甚至存在 /tmp/test 目录,并且存在几个文件。

Step 3/8 : ADD /tmp/test/ /opt/
ADD failed: file not found in build context or excluded by .dockerignore: stat tmp/test/: file does not exist
Build step 'Execute shell' marked build as failure
Finished: FAILURE

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

从描述来看,您似乎跳过了各个步骤,而忽略了在命令执行后容器将停止的事实。容器停止后,K8 尝试重新启动它但没有成功,因为该命令将完成并再次停止容器。此外,我认为 kubectl 不适用于此类用例,但您可能有自己的理由,所以我将其留在那里。

考虑到您使用的是 kubectl,我做了一个工作示例

FROM alpine as build
RUN cd /bin && touch test123
CMD echo "Hello world" && sleep 6000
EXPOSE 9005
EXPOSE 9006

变化:

  1. /bin 文件夹的路径不正确。所以我修好了。
  2. 为了避免容器停止,我添加了 sleep 命令来保持它。

将此 Dockerfile 放入单独的文件夹中,然后在该文件夹中运行

docker build -t hello_world:1.0 .

这将构建名为 hello_world:1.0 的镜像。然后启动K8集群

kubectl run hello --image=hello_world:1.0

现在您将拥有名为“hello”的 pod 和相应的容器,您可以在其中执行。要执行到容器中,请运行:

kubectl exec -i --tty hello -- /bin/sh

这将在容器内启动一个交互式 shell 会话。如果您运行

,您也可以在那里看到您的文件
ls /bin

Here 是提供更多信息的文档。

我希望该示例能帮助您解决问题。