在Docker容器内启动另一个容器遇docker-compose未找到问题求解决
问题:容器内通过脚本启动另一个容器失败,提示docker-compose未找到
我使用Dockerfile构建Docker镜像,通过docker-compose部署,希望在container-1中运行shell脚本以启动container-2。参考了两篇Stack Overflow相关帖子但未能解决问题,现提供相关配置文件及报错信息,求最简实现方案。
用户提供的配置文件
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["Backend/Backend.API.csproj", "Backend/"] COPY ["BuildingBlock/CacheHandler/CacheHandler.csproj", "BuildingBlock/CacheHandler/"] COPY ["Backend.Domain/Backend.Domain.csproj", "Backend.Domain/"] RUN dotnet restore "Backend/Backend.API.csproj" COPY . . WORKDIR "/src/Backend" RUN dotnet build "Backend.API.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Backend.API.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM mcr.microsoft.com/dotnet/sdk:6.0 AS install-docker-cli RUN apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg RUN echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null RUN apt-get update && apt-get install -y docker-ce-cli FROM base AS final WORKDIR /app COPY --from=publish /app/publish . COPY --from=install-docker-cli /usr/bin/docker /usr/bin/docker ENTRYPOINT ["dotnet", "Backend.API.dll"]
docker-compose配置
Backendbuild: context: . dockerfile: Dockerfile volumes: - /var/run/docker.sock:/var/run/docker.sock
报错信息
line 11: docker-compose: command not found
最简解决方案
原因分析
报错核心是container-1的镜像里只安装了docker-ce-cli(Docker基础命令行工具),但缺少docker-compose工具,导致脚本调用时提示找不到命令。
方案1:安装docker-compose到镜像中
修改Dockerfile的install-docker-cli阶段新增docker-compose安装步骤,再复制到最终镜像:
# 原install-docker-cli阶段新增内容 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS install-docker-cli RUN apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg RUN echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null RUN apt-get update && apt-get install -y docker-ce-cli # 新增:下载并安装docker-compose RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose RUN chmod +x /usr/local/bin/docker-compose # 原final阶段新增复制docker-compose的步骤 FROM base AS final WORKDIR /app COPY --from=publish /app/publish . COPY --from=install-docker-cli /usr/bin/docker /usr/bin/docker # 新增:复制docker-compose到最终镜像 COPY --from=install-docker-cli /usr/local/bin/docker-compose /usr/local/bin/docker-compose ENTRYPOINT ["dotnet", "Backend.API.dll"]
同时确保容器内用户有权限访问/var/run/docker.sock:若使用非root用户,需将其加入docker组;追求最简可直接以root用户运行容器(在docker-compose配置中添加user: root)。
方案2:改用docker run替代docker-compose(更简洁)
如果只是启动单个container-2,无需依赖docker-compose,直接在脚本中使用docker run命令:
docker run -d --name container-2 [你的镜像名称:标签]
这种方式无需修改Dockerfile安装docker-compose,仅保留原有的docker-ce-cli即可,镜像体积更小,实现更简单。
内容的提问来源于stack exchange,提问作者Kim NANA
相关产品推荐
相关产品推荐

