关于docker容器内要启动两个进程时Dockerfile的编写

本文介绍了在Docker容器内启动多个进程时遇到的问题,特别是当尝试使用start.sh启动cron定时任务时,容器会随着start.sh的结束而退出。原因在于Docker容器仅能管理一个主进程,当该进程结束,容器也会停止。解决方案是在start.sh中让crond以-f参数在前台运行,确保start.sh不会退出,从而保持容器持续运行。此外,总结了在Dockerfile中启动多进程的注意事项,包括进程的后台运行和前台运行的正确使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期想做一个cron定时任务的docker,在Dockerfile中做如下定义

FROM library/alpine:latest
RUN apk --update add rsync openssh bash
VOLUME ["/data"]
ADD start.sh /
CMD ["/bin/bash","/start.sh"]

在start.sh中用crontab 加载定时任务run.cron,然后启动crond:

/usr/bin/crontab /run.cron

/usr/sbin/crond

docker build Dockerfile后,采用docker run –name xxx -d 运行容器,发现start.sh执行后容器就退出了,根本无法启动定时任务,网上各种办法有说用nohup,有死循环,还有说用信号,发现都不靠谱。分析了一下docker的机制,一个docker容器同时只能管理一个进程,这个进程退出后,容器也就退出了。这并不意味着一个容器里只能同时运行一个进程(那样太浪费了),只是最后一个运行的进程不能退出。这个案例在容器启动运行start.sh,crond的缺省设置是后台运行,这样导致start.sh运行结束,容器跟着start.sh退出而退出。因此,在start.sh中,crond 应强制采用前台运行:crond -f。这样start.sh就不会退出, docker run -d 运行时就可以保持容器后台运行。

start.sh总结总结:

(1)容器中运行多个守护进程时,前面的进程要用后台方式运行(或添加 &),否则后面的服务无法启动

(2)容器中最后一个守护进程一定要用前台方式运行,否则start.sh退出,容器退出,所有的服务就白启动了

FROM ubuntu:latest

RUN mkdir -p "/usr/src/pdas" \
    mkdir -p "/usr/src/pdas/reload"

COPY bin.tar /usr/src/pdas
COPY config.tar /usr/src/pdas
COPY lib.tar /usr/src/pdas

WORKDIR /usr/src/pdas
RUN tar -xvf lib.tar && \
    tar -xvf bin.tar && \
    tar -xvf config.tar

ENV LD_LIBRARY_PATH /usr/src/pdas/lib/libxml/lib:/usr/src/pdas/lib/curl/lib:$LD_LIBRARY_PATH

WORKDIR /usr/src/pdas/bin
RUN chmod +x start.sh && \
    chmod +x f_recv && \
    chmod +x f_send

VOLUME /behb/diqu
VOLUME /var/log/pdas

ENTRYPOINT ./start.sh

其中 ./start.sh脚本如下

#!/bin/bash
./f_recv &
./f_send

以上是docker镜像启动脚本的一点心得

### 如何在Docker容器内安装配置PyTorch环境 #### 创建Dockerfile 为了确保环境中所有依赖项都得到妥善处理,建议通过编写 `Dockerfile` 来定义 PyTorch 的 Docker 镜像。这使得整个过程可重复且易于分享给其他开发者。 ```dockerfile FROM nvidia/cuda:11.6.2-base-ubuntu20.04 # 安装必要的软件包 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ python3-pip \ python3-dev \ git \ cmake \ build-essential \ libjpeg-dev \ wget \ ca-certificates \ curl \ vim \ nano \ openssh-server \ locales \ tzdata \ && rm -rf /var/lib/apt/lists/* # 设置Python虚拟环境 WORKDIR /workspace ENV PATH="/env/bin:$PATH" RUN pip3 install --upgrade pip setuptools wheel # 安装PyTorch及相关库 RUN pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116 # 复制项目文件至工作区 COPY . . CMD ["bash"] ``` 此脚本首先选择了带有 CUDA 支持的基础 Ubuntu 映像作为起点[^1]。接着更新了系统的软件包列表,并安装了一些基本工具和 Python 开发所需的组件。之后设置了一个名为 `/workspace` 的工作目录用于放置应用程序代码和其他资源文件。最后一步则是安装特定版本的 PyTorch 和其配套的数据加载器(如 TorchVision),这里指定了适用于 NVIDIA GPU 加速计算的 cuDNN 版本[^2]。 #### 构建与运行Docker镜像 一旦完成了上述 `Dockerfile` 文件的编辑保存,在终端执行如下命令即可开始构建新的 Docker 镜像: ```shell docker build -t custom-pytorch-env . ``` 这条指令会读取当前路径下的 `Dockerfile` 并按照其中指示逐步组装成一个新的 Docker 镜像标签为 `custom-pytorch-env`[^3]。 当构建完成后,可以通过下面的方式启动新创建好的容器实例: ```shell docker run -it --rm --gpus all custom-pytorch-env bash ``` 这里的 `-it` 参数允许交互模式下操作;`--rm` 表示退出后自动删除临产生的容器数据;而 `--gpus all` 则授予容器访问主机上所有的GPU设备权限以便充分利用硬件加速能力[^4]。 #### 进入已有的Docker容器 如果已经有一个正在运行中的容器想要连接进去修改某些东西或者调试程序的话,则可以采用以下方法之一: * 使用 `docker exec` 命令附加到现有进程中去而不终止它; ```shell docker exec -it container_id_or_name bash ``` * 或者直接附着于指定ID或名称对应的进程之上 ```shell docker attach container_id_or_name ``` 这两种方式都可以让用户获得一个 shell 提示符从而进一步探索内部状态或是调整参数设定等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值