在docker-compose

时间:2017-07-20 10:05:45

标签: docker docker-compose docker-entrypoint

我修改了https://hub.docker.com/_/solr/上给出的docker-compose.yml文件,添加了volumes配置和entrypoint中的更改。修改后的文件如下:

version: '3'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - ./solr/init.sh:/init.sh
      - ./solr/data:/opt/solr/server/solr/mycores
    entrypoint:
      - init.sh
      - docker-entrypoint.sh
      - solr-precreate
      - mycore

我需要在入口点启动之前运行这个'init.sh',以便在容器中准备我的文件。

但我得到以下错误:

  

错误:对于solr_solr_1无法启动服务solr:oci运行时错误:   container_linux.go:247:启动容器进程导致“exec:   \“init.sh \”:$ PATH中找不到可执行文件“

之前我在here的neo4j中发现了官方图像挂钩。我也可以在这里使用类似的东西吗?

更新1:通过以下评论,我意识到dockerfile设置为WORKDIR /opt/solr,因为executable file not found in $PATH。所以我通过使用/init.sh提供入口点的绝对路径来测试。但这也给出了错误,但却有所不同:

  

standard_init_linux.go:178:exec用户进程导致“exec格式化   错误“

2 个答案:

答案 0 :(得分:4)

您似乎需要将卷映射到/docker-entrypoint-initdb.d /

version: '3'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - ./solr/init.sh:/docker-entrypoint-initdb.d/init.sh
      - ./solr/data:/opt/solr/server/solr/mycores
    entrypoint:
      - docker-entrypoint.sh
      - init

https://hub.docker.com/_/solr/

  

扩展图像 docker-solr图像具有扩展机制。在运行时,在启动Solr之前,容器将会   在/docker-entrypoint-initdb.d/目录中执行脚本。您可以   通过使用已安装的卷或使用来添加您自己的脚本   自定义Dockerfile。这些脚本可以例如复制核心   带有预加载数据的目录,用于持续集成测试,或   修改Solr配置。

docker-entrypoint.sh似乎负责根据传递给它的参数运行sh脚本。所以init是第一个参数,它反过来试图运行init.sh

docker-compose logs solr | head

更新1:

我一直在努力让这个工作起来,并最终弄清楚为什么我的docker-compose在指向/docker-entrypoint-initdb.d/init.sh的docker run -v工作时无效。

事实证明,删除入口点树是解决方案。这是我最后的码头工作者:

version: '3'
services:
  solr:
    image: solr:6.6-alpine
    ports:
     - "8983:8983"
    volumes:
      - ./solr/data/:/opt/solr/server/solr/
      - ./solr/config/init.sh:/docker-entrypoint-initdb.d/init.sh

my ./solr/config/init.sh

#!/bin/bash
echo "running"
touch /opt/solr/server/solr/test.txt;
echo "test" > /opt/solr/server/solr/test.txt;

答案 1 :(得分:0)

对我有用的替代解决方案是通过放置/bin/sh来修改入口点。之后看起来有点像这样

/** * @Entity */ class User { /** * @OneToMany */ private $debtors; public function getDebtors() { return $this->debtors; } public function setDebtors($debtors) { $this->debtors = $debtors; return $this; } } 其中test.sh是在容器内运行所需的bash脚本。