触摸命令不影响 Docker 图片

Touch command is not affecting Docker image

我正在尝试在 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

有什么想法吗?谢谢!

从描述来看,您似乎跳过了多个步骤,并且忽略了容器将在命令执行后停止这一事实。容器停止后,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. 为了避免容器停止,我添加了睡眠命令来保持它。

将此 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 是进一步信息的文档。

希望该示例对您的问题有所帮助。