Linux 在Docker build中创建文件

Linux 在Docker build中创建文件,linux,bash,docker,shell,dockerfile,Linux,Bash,Docker,Shell,Dockerfile,我正在构建一个映像,用于安装依赖项、克隆git存储库、设置python环境、更新配置文件和创建systemctl服务。除了我在流程结束时尝试创建的脚本(start.sh)之外,其他一切都正常。它似乎在docker build步骤中出现,但一旦我运行图像,它就会消失 #Dockerfile 运行echo“#!/bin/bash”>start.sh 运行echo“systemctl start jenkins”>>start.sh 运行echo“systemctl start runserver”>

我正在构建一个映像,用于安装依赖项、克隆git存储库、设置python环境、更新配置文件和创建systemctl服务。除了我在流程结束时尝试创建的脚本(start.sh)之外,其他一切都正常。它似乎在docker build步骤中出现,但一旦我运行图像,它就会消失

#Dockerfile
运行echo“#!/bin/bash”>start.sh
运行echo“systemctl start jenkins”>>start.sh
运行echo“systemctl start runserver”>>start.sh
运行cat start.sh
运行chmod+x start.sh
我的docker生成终端输出

Step 28/32 : RUN echo "#!/bin/bash" > start.sh
 ---> Running in 4a3f91a67b90
Removing intermediate container 4a3f91a67b90
 ---> 7fc47c36f4b8
Step 29/32 : RUN echo "systemctl start jenkins" >> start.sh
 ---> Running in 6807840fab7e
Removing intermediate container 6807840fab7e
 ---> d945ba395f9d
Step 30/32 : RUN echo "systemctl start runserver" >> start.sh
 ---> Running in 205c38c6e9e3
Removing intermediate container 205c38c6e9e3
 ---> 5684fd6346b9
Step 31/32 : RUN cat start.sh
 ---> Running in ce3326beb99c
#!/bin/bash
systemctl start jenkins
systemctl start runserver
Removing intermediate container ce3326beb99c
 ---> efd96d67c6c3
Step 32/32 : RUN chmod +x start.sh
 ---> Running in fffd5de0f924
我已尝试设置绝对路径来定义目标文件:

#Dockerfile
运行echo“#!/bin/bash”>/home/ubuntu/start.sh
...
但它失败了

这里可能出了什么问题

更新

要运行映像,请执行以下操作:

docker运行-tid\
--名称自动服务器\
--rm\
--卷数据:/home/ubuntu\
--发布8080:8080\
--发布8000:8000\
--出版50000:50000\
--cap add=网络管理员\
--cap add=净原始值\
自动服务器:1.0
要查看壳消失,请执行以下操作:

#容器构建
$docker build-t自动服务器:1.0。
... 
步骤27/31:运行echo“#!/bin/bash”>/home/ubuntu/start.sh
--->在2a022fcec2f4中运行
拆卸中间容器2a022fcec2f4
--->c9d1ff27d96f
步骤28/31:运行echo“systemctl start jenkins”>>/home/ubuntu/start.sh
--->在3ed993cd03c7中运行
拆卸中间容器3ed993cd03c7
--->0e8c4463c472
步骤29/31:运行echo“systemctl start runserver”>>/home/ubuntu/start.sh
--->在aa31dbce3716中运行
拆卸中间容器aa31dbce3716
--->d48a1fd0580c
步骤30/31:运行cat/home/ubuntu/start.sh
--->在23785ebdb620中运行
#!/bin/bash 7499157cede3
步骤31/31:运行chmod+x/home/ubuntu/start.sh
--->在43980bffe8cc中运行
拆卸中间容器43980bffe8cc
--->2932ca0c3d29
成功构建2932ca0c3d29
已成功标记自动服务器:1.0
$docker run-tid\
--名称自动服务器\
--rm\
--卷数据:/home/ubuntu\
--发布8080:8080\
--发布8000:8000\
--出版50000:50000\
--cap add=网络管理员\
--cap add=净原始值\
自动服务器:1.0
$docker exec-ti自动服务器bash
root@a36c99271b8a:/home/ubuntu#
root@a36c99271b8a:/home/ubuntu#ls-la
总数1856
drwxr-xr-x。3根根4096十月5日08:36。
drwxr-xr-x。1根根4096十月6日05:56。。
drwxr-xr-x。8根根4096十月5日09:21自动
-rw-r--r--。1根1885433 10月5日08:20 get-pip.py

当我在我的Dockerfile中使用
CMD[“bash”、“-c”、“systemctl start jenkins”]
时,当我运行映像时,jenkins服务启动。

在run命令中,您将本地目录装载到
/home/ubuntu

--volume data:/home/ubuntu \
这意味着
/home/ubuntu
中的任何内容都将替换为本地
数据的内容
您可以将脚本写入不同的路径示例
/opt/scripts/start.sh


或者,您可以在
数据目录中的
Dockerfile
之外创建脚本。

如何运行图像?(你是在用卷隐藏图像内容吗?)第一个近似值是
systemctl
,类似的命令在Docker中不起作用,通常最好将其拆分为两个单独的容器,而不是尝试在一个容器中运行两个单独的服务。
但是一旦我运行了图像,它会消失。
请说明您是如何运行图像的,以及如何知道图像会消失?脚本应该在图像本身中。你证实了吗?此外,在构建映像时使用RUN命令,为了运行容器进程,我们必须使用CMD或ENTRYPOINT。当您对脚本进行cat时,您不会重定向到映像上的文件。并且您正在设置的烫发不在图像上的文件中。使用COPY cmd不是更好吗?您还需要设置入口点。
--卷数据:/home/ubuntu
。。。。所以你用一些
数据
卷替换/home/ubuntu,这样里面的所有东西都会丢失。如果您想在
数据
卷中创建一些文件,请在那里创建它。