首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker-组成入口点/命令

Docker-组成入口点/命令
EN

Stack Overflow用户
提问于 2019-01-12 22:04:59
回答 1查看 21.3K关注 0票数 9

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

我尝试更改命令: for entrypoint:,但我得到了相同的问题。

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/bin/sh
apt-get update
apt-get install -y smbclient nano
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-12 22:14:38

Docker容器只运行一条命令,当该命令完成时,容器退出。如果容器没有入口点,则是来自docker-compose.ymlcommand:docker run命令中图像名称后面的任何参数或来自DockerfileCMD。如果它确实有入口点(entrypoint:docker run --entrypoint ...ENTRYPOINT),那么它就是入口点,它将作为参数传递给命令。

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

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

代码语言:javascript
复制
FROM nextcloud
RUN apt-get update \
 && apt-get install smbclient

docker-compose.yml中,将image:行更改为

代码语言:javascript
复制
services:
 nextcloud:
   build: .  # instead of image:

(作为一个风格问题,我不会显式地设置container_name:network_mode:,这里的Docker Compose默认值就可以了。我也不会在容器中安装nano或任何其他文本编辑器,因为一旦重新启动容器,您在本地所做的任何更改都会丢失。当您仍在调试映像时,我也会暂缓使用restart: always规范,但一旦您更加确信一切都正常工作,它就会变得合理。)

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54160315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档