Docker 容器在定义入口点时重新启动

rag*_*hav 3 docker dockerfile docker-compose

我正在尝试在我的 docker 容器中运行 shell 脚本作为入口点。为此,我在 Dockerfile 中定义了一个入口点,如下所示

abc.Dockerfile

FROM ubuntu
COPY abc.sh /
RUN chmod +x /abc.sh
ENTRYPOINT /abc.sh
Run Code Online (Sandbox Code Playgroud)

Dockerfile 已成功构建,但在exec容器中执行时出现错误:

$ docker exec -it drupaldocker_myapp_1 bash
Error response from daemon: Container ca32bafe2247e51d5e9b1a8f0cf83457ccecb29e8ff9747a8c98aa6a046b0550 is restarting, wait until the container is running
Run Code Online (Sandbox Code Playgroud)

docker ps的输出

Raghav-Macbook:iflychat-server-development-system raghav$ docker ps
CONTAINER ID        IMAGE                COMMAND                    CREATED             STATUS                         PORTS                    NAMES
ca32bafe2247        drupaldocker_myapp   "/bin/sh -c \"/abc.sh\""   9 minutes ago       Restarting (0) 2 minutes ago                            drupaldocker_myapp_1
Run Code Online (Sandbox Code Playgroud)

我的docker-compose.yml看起来像

version: '2'
services:
  myapp:
   build:
    context: .
    dockerfile: abc.Dockerfile
   restart: always
   tty: true
Run Code Online (Sandbox Code Playgroud)

abc.sh

#!bin/sh

ls
cat /abc.sh
Run Code Online (Sandbox Code Playgroud)

另外,docker-compose up没有给我任何错误。输出看起来像

Raghav-Macbook:drupal-docker raghav$ docker-compose up
Recreating drupaldocker_myapp_1
Attaching to drupaldocker_myapp_1 
myapp_1  | oot  etc   lib    media  opt root  sbin  sys  usr
myapp_1  | bin  dev   home  lib64  mnt    proc  run   srv   tmp  var
myapp_1  | #!bin/sh 
myapp_1  | 
myapp_1  | ls
Run Code Online (Sandbox Code Playgroud)

我应该做哪些改变才能使这项工作发挥作用?

编辑

输出docker logs drupaldocker_myapp_1

abc.sh  boot  etc   lib    media  opt   root  sbin  sys  usr
bin dev   home  lib64  mnt    proc  run   srv   tmp  var 
#!bin/sh

ls
cat /abc.shabc.sh   boot  etc   lib    media  opt   root  sbin  sys  usr
bin dev   home  lib64  mnt    proc  run   srv   tmp  var
#!bin/sh

ls
cat /abc.sh
Run Code Online (Sandbox Code Playgroud)

编辑2

执行入口点脚本后容器是否会停止?

Osc*_*vis 5

我认为你想要的是 docker run 而不是 docker exec 命令。Docker exec 是在已经部署并运行的容器上启动一些东西......而你想要的是在部署后启动一个脚本。

修改您的 Dockerfile。使用它代替最后一行的入口点:

CMD ["bash", "-c", "/abc.sh"]
Run Code Online (Sandbox Code Playgroud)

使用此命令运行它,脚本将自动启动:

docker run -it drupaldocker_myapp_1
Run Code Online (Sandbox Code Playgroud)

如果您将其放在bashdocker run 命令的末尾,您将在容器内获得一个交互式 bash 控制台,但会避免自动启动脚本:

docker run -it drupaldocker_myapp_1 bash
Run Code Online (Sandbox Code Playgroud)

回答您的问题“执行入口点脚本后容器是否会停止?” 答案是肯定的。如果执行了入口点脚本并且没有任何其他要执行的内容,则容器将停止,因为它没有更多的事情可做。如果您希望容器保持正常运行,您应该在其中运行一些没有立即结束的内容,例如脚本。

希望能帮助到你。