【问题标题】:docker compose: issue to start a container with a specific shell scriptdocker compose:使用特定 shell 脚本启动容器的问题
【发布时间】:2021-03-16 22:18:05
【问题描述】:

我会使用 docker compose 启动一个带有特定 shell 脚本的容器。 例如,一个 tomcat 容器启动 initweb.sh 创建空文件 /tmp/testweb

$ ls -lR 
.:
total 8
-rw-rw-r-- 1 xxxxxx xxxxxx  223 déc.   4 19:45 docker-compose.yml
drwxrwxr-x 2 xxxxxx xxxxxx 4096 déc.   4 19:37 web

./web:
total 4
-rwxrwxr-x 1 xxxxxx xxxxxx 31 déc.   4 19:37 initweb.sh


$ cat docker-compose.yml 
version: '3'
services:
  web:
    container_name: web
    hostname: web
    image: "tomcat:7.0-jdk8"
    ports:
      - 8080:8080
    volumes:
      - "./web/:/usr/local/bin/"
    command: sh -c "/usr/local/bin/initweb.sh"


$ cat web/initweb.sh 
#!/bin/bash
touch /tmp/testweb

当我执行 docker-compose up 时

$ docker-compose up -d
Creating network "tomcat_default" with the default driver
Creating web ... done

$ docker-compose run web ls -l /usr/local/bin/
total 4
-rwxrwxr-x 1 1000 1000 31 Dec  4 18:37 initweb.sh

$ docker-compose run web ls -l /tmp
total 4
drwxr-xr-x 1 root root 4096 Nov 24 01:29 hsperfdata_root

我的脚本 initweb.sh 的所有者不是 root,所以也许这就是它没有执行但我不知道如何解决这个问题的原因。

【问题讨论】:

  • /tmp 不是持久的...每次启动 docker /tmp 应该总是开始为空
  • 每个docker-compose run 命令都会启动一个具有不同每个容器文件系统的新容器。在您的主容器中,当启动脚本在触摸文件后启动服务器时,它应该会看到创建的文件。

标签: bash docker shell docker-compose sh


【解决方案1】:

你需要让 initweb.sh 表现得像一个服务器进程:

#!/bin/bash
touch /tmp/testweb
sleep infinity

然后

~$ docker-compose up -d
Creating network "tmp_default" with the default driver
Creating web ... done
~$ docker-compose exec web ls -l /tmp
total 4 
drwxr-xr-x 1 root root 4096 Nov 24 01:29 hsperfdata_root
-rw-r--r-- 1 root root    0 Dec  4 22:39 testweb

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 2015-09-11
    • 2018-05-16
    • 1970-01-01
    • 2017-08-10
    • 2017-02-06
    • 2021-12-14
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多