如何将文件传输到Docker容器并执行代码,实现全流程自动化?
方案1:构建镜像时直接内置代码(最稳定,适合发布场景)
你之前的误区是RUN指令属于镜像构建阶段执行的命令,执行时还没有启动容器,也没有本地代码传入,只需要把拷贝文件的步骤提前放到Dockerfile里即可,完整Dockerfile示例如下:
# 基础镜像 FROM ubuntu:16.04 # 先安装编译依赖(ubuntu16.04默认没有gcc、make) RUN apt update && apt install -y gcc make # 创建工作目录 RUN mkdir -p /code/src # 把本地当前目录下的src文件夹内容拷贝到镜像的/code/src路径 COPY src/ /code/src/ # 切换工作目录 WORKDIR /code/src/ # 构建阶段编译代码 RUN make # 容器启动时默认执行的命令 CMD ["./hello_world"]
构建和运行命令:
# 构建镜像,在Dockerfile所在目录执行 docker build -t my_hello_app . # 启动容器直接运行 docker run --name test_container my_hello_app
方案2:启动容器时挂载本地代码目录(适合开发调试,改代码不用重新构建镜像)
如果你的代码需要频繁修改,不想每次改完都重新构建镜像,可以只把依赖环境打包到镜像里,启动容器时把本地src目录挂载到容器内,直接运行编译执行命令:
Dockerfile示例:
FROM ubuntu:16.04 RUN apt update && apt install -y gcc make RUN mkdir -p /code/src WORKDIR /code/src/
构建镜像后,直接用挂载参数启动容器:
docker run --name test_container -v 本地src目录的绝对路径:/code/src my_hello_app bash -c "make && ./hello_world"
本地改完代码直接重新执行上面的run命令即可,不用重新build。
方案3:宿主机Shell脚本自动化原流程
如果一定要沿用你原来「启动空容器→拷文件→执行代码」的逻辑,直接在宿主机写个shell脚本串起所有命令即可,不需要改Dockerfile:
脚本内容示例:
#!/bin/bash # 启动后台容器 docker run -d --name test_container my_image sleep infinity # 拷贝本地文件到容器 docker cp src/. test_container:/code/src # 进入容器执行编译运行命令 docker exec test_container bash -c "cd /code/src && make && ./hello_world" # 运行完删除容器(可选) docker rm -f test_container
给脚本加执行权限后直接运行即可完成全流程自动化。
之前方案出错的原因:
RUN指令是镜像构建阶段执行的,此时容器还未启动,本地代码也没有传入镜像,自然找不到要编译的文件。docker cp是宿主机才能执行的命令,容器内部默认没有Docker客户端,也不可能在构建阶段操作还没创建的容器,所以写在Dockerfile的RUN里完全无法生效。
内容的提问来源于stack exchange,提问作者SeismicSandwhich
相关产品推荐
相关产品推荐

