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

时间:2017-04-20 12:55:42

标签: docker docker-compose dockerfile

我试图在我的docker容器中运行shell脚本作为入口点。为此,我在Dockerfile中定义了一个像这样的

的入口点

abc.Dockerfile

sed

Dockerfile成功构建,但在with open(tmp_path) as f, open(out_path, 'w') as outfile: for line in f.readlines(): if not line.strip(): continue if line: outfile.write(line) 进入容器时我收到错误:

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

docker ps的输出:

exec

我的 docker-compose.yml 看起来像

$ docker exec -it drupaldocker_myapp_1 bash
Error response from daemon: Container ca32bafe2247e51d5e9b1a8f0cf83457ccecb29e8ff9747a8c98aa6a046b0550 is restarting, wait until the container is running

abc.sh

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

此外,version: '2' services: myapp: build: context: . dockerfile: abc.Dockerfile restart: always tty: true 没有给我任何错误。输出看起来像

#!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

编辑2

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

1 个答案:

答案 0 :(得分:2)

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

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

CMD ["bash", "-c", "/abc.sh"]

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

docker run -it drupaldocker_myapp_1

如果你将bash放在docker run命令的末尾,你将在容器内部获得一个交互式bash控制台,但是避免了自动脚本启动:

docker run -it drupaldocker_myapp_1 bash

回答您的问题“执行入口点脚本后容器是否会停止?”答案是肯定的。如果执行入口点脚本并且没有其他任何内容要执行,则容器会停止,因为它没有其他任何操作。如果你想让一个容器保持运行,你应该在它内部运行一些没有像脚本那样立即结束的东西。

希望它有所帮助。