我正在尝试使用现有的docker.compose.yaml文件将软件包(纳米)添加到容器中。我可以让它在部署后运行脚本,但是由于某种原因,它会不断循环运行脚本。这是预期的目的吗? 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
答案 0 :(得分:0)
一个Docker容器仅运行一个命令,当该命令完成后,该容器退出。如果容器没有入口点,则是command:
中的docker-compose.yml
,docker run
命令中图像名称之后的任何参数,或CMD
中的Dockerfile
。如果它确实有一个入口点(entrypoint:
,docker run --entrypoint ...
,ENTRYPOINT
),则是入口点,它将作为参数传递命令。
简而言之:如果您在docker-compose.yml
中传递一个入口点或命令,则它将运行而不是容器正常运行的服务器。没有简单的Docker方法可以在主进程之前或之后运行“挂钩”。
在特定情况下,在启动时将软件安装到容器中是一种反模式:每次容器启动时都必须重复此过程,如果外部软件包存储库关闭,则启动可能会失败。您可以在与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
规范,尽管一旦您这样做就很合理更确信一切正常。)