定义entrypoint后Docker容器重启

3
我是一名翻译助手,以下是翻译内容:

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

abc.Dockerfile

FROM ubuntu
COPY abc.sh /
RUN chmod +x /abc.sh
ENTRYPOINT /abc.sh

Dockerfile构建成功,但在执行exec进入容器时出现错误:
$ docker exec -it drupaldocker_myapp_1 bash
Error response from daemon: Container ca32bafe2247e51d5e9b1a8f0cf83457ccecb29e8ff9747a8c98aa6a046b0550 is restarting, wait until the container is running

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

我的 docker-compose.yml 文件如下:
version: '2'
services:
  myapp:
   build:
    context: .
    dockerfile: abc.Dockerfile
   restart: always
   tty: true

abc.sh

#!bin/sh

ls
cat /abc.sh

此外,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

我应该做哪些改变才能让这个工作?

编辑

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

编辑2

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


请发布docker logs drupaldocker_myapp_1的输出。 - kstromeiraos
2
这个容器应该做什么?脚本在不到一秒钟的时间内完成,而容器却不断重新启动和重新执行脚本。 - tkausl
你是用 docker run --restart=always 来启动它吗? - user2915097
容器中包含一些文件,我需要使用Shell脚本在容器每次启动时替换其中的一些字符串。 - raghav
@user2915097 我正在使用 docker-compose up 命令运行我的容器,并在其中定义了 restart: always - raghav
显示剩余2条评论
1个回答

5
我认为你需要的是docker run而不是docker exec命令。Docker exec是在已部署并运行的容器上启动某个东西,而你想要的是在部署时启动一个脚本。
修改你的Dockerfile,在最后一行使用这个而不是entrypoint:
CMD ["bash", "-c", "/abc.sh"]

使用此命令运行它,脚本将自动启动:
docker run -it drupaldocker_myapp_1

如果你在运行docker命令时在结尾处加上bash,就能够在容器内得到一个交互式的bash终端。这种方式会避免自动脚本的启动。
docker run -it drupaldocker_myapp_1 bash

回答你的问题:“一旦执行入口脚本,容器是否会停止?”答案是肯定的。如果入口脚本被执行并且没有其他需要执行的内容,那么容器将停止,因为它没有其他任务要完成。如果您想让容器保持运行状态,您应该在其中运行一些没有即时结束的东西,比如一个脚本。
希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接