Docker-Compose 入口点/命令

use*_*449 6 command docker docker-compose

我正在尝试使用我现有的 docker.compose.yaml 文件将包(nano)添加到容器中。我可以让它在部署后运行脚本,但由于某种原因它不断循环脚本。这是预期的目的吗?TBH 我对整个 docker-compose.yaml 设置还很陌生,所以我不知道这是否是我应该做的!

我试过更改 command: for entrypoint: 但我遇到了同样的问题。

version: '3.4'

services:
  nextcloud:
    image: nextcloud
    container_name: "nextcloud"
    restart: always
    ports:
      - 8080:80
    volumes:
      - /dconfig/nextcloud/data:/var/www/html/data
      - /dconfig/nextcloud/config:/var/www/html/config
    network_mode: "bridge"
    environment:
      - TZ=Europe/London
      - PGID=1000
      - PUID=1000
    command: /var/www/html/config/install.sh
Run Code Online (Sandbox Code Playgroud)

安装文件

#!/bin/sh
apt-get update
apt-get install -y smbclient nano
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 14

一个 Docker 容器只运行一个命令,当该命令完成时,容器退出。如果容器没有入口点,则它是command:from docker-compose.ymldocker run命令中图像名称后的任何参数,或CMDfrom Dockerfile。如果它确实有一个入口点 ( entrypoint:, docker run --entrypoint ..., ENTRYPOINT),它就是入口点,它将命令作为参数传递。

简而言之:如果您在 中传递入口点或命令docker-compose.yml,它将运行而不是容器通常运行的服务器。没有简单的 Docker 方法可以在主进程之前或之后运行“钩子”。

在您的特定情况下,在启动时将软件安装到容器中是一种反模式:每次容器启动时都必须重复,如果外部包存储库关闭,启动可能会失败。您可以Dockerfile在与以下内容相同的目录中编写一个非常简单的docker-compose.yml

FROM nextcloud
RUN apt-get update \
 && apt-get install smbclient
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml, 换image:行说

services:
 nextcloud:
   build: .  # instead of image:
Run Code Online (Sandbox Code Playgroud)

(就风格而言,我不会设置container_name:network_mode:明确,此处的 Docker Compose 默认值很好。我也不会nano在容器中安装或任何其他文本编辑器,因为您在本地所做的任何更改都会在您重新启动容器。虽然您仍在调试映像restart: always,但我也会推迟制定规范,尽管一旦您更加确信一切正常,这是合理的。)

  • 为了给这个可靠的答案添加一点内容,重新启动:在配置中总是会导致容器在每次成功退出脚本后不断重新启动,这会导致您观察到的重复运行;每次容器运行时都会运行。如果你想让它保持活动状态并防止循环,你可以切换到入口点,并传递一个以 tail -f /dev/null 或一些无意义且不会退出的内容结尾的脚本文件 (7认同)