docker - Docker-Compose入口点/命令

标签 docker docker-compose command

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

我试过更改命令:的入口点:但我遇到相同的问题。

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

install.sh
#!/bin/sh
apt-get update
apt-get install -y smbclient nano

最佳答案

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

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

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

FROM nextcloud
RUN apt-get update \
 && apt-get install smbclient

docker-compose.yml中,将image:行更改为
services:
 nextcloud:
   build: .  # instead of image:

(就样式而言,我不会显式设置container_name:network_mode:,这里的Docker Compose默认设置很好。我也不会在容器中安装nano或任何其他文本编辑器,因为您在本地所做的任何更改都会丢失重新启动容器后,尽管仍在调试镜像,但我也坚持使用restart: always规范,尽管一旦您确信一切正常,这是合理的。)

关于docker - Docker-Compose入口点/命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160315/

相关文章:

node.js - docker找不到本地nodejs模块

amazon-web-services - Elastic Beanstalk CLI,如何使用RDS实例创建环境?

wordpress - 如何在linode上备份dockerized wordpress?

windows - 如何在 Docker for Windows 上更新 docker-compose?

docker - 无法使用 Docker 运行 Strapi

shell - 后台运行时进程未记录

docker - 使用环境变量在 docker-compose.yml 中设置 bool 值

c# - 将命令与 TabItem 一起使用

python - 将命令插入 Bash Shell

linux - !* 在 tcsh shell 中是什么意思?