10

我修改了https://hub.docker.com/_/solr/上给出的docker-compose.yml文件,在. 修改后的文件如下:volumesentrypoint

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 中找不到可执行文件”

早些时候我从这里发现了 neo4j 中的官方图像挂钩。我也可以在这里使用类似的东西吗?

更新 1:从下面的评论中,我意识到 dockerfile 设置是WORKDIR /opt/solr由于executable file not found in $PATH. 所以我通过使用提供入口点的绝对路径来进行测试/init.sh。但这也会产生错误,但会产生不同的错误:

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

4

2 回答 2

7

看起来您需要将卷映射到 /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 run -v的 docker-compose 在指向 /docker-entrypoint-initdb.d/init.sh 工作时没有工作。

事实证明,删除入口点树是解决方案。这是我最后的 docker-compose:

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

我的 ./solr/config/init.sh

#!/bin/bash
echo "running"
touch /opt/solr/server/solr/test.txt;
echo "test" > /opt/solr/server/solr/test.txt;
于 2017-10-05T18:10:52.600 回答
2

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

version: '3'
services:
  web:
    build: .
    volumes:
    - .:/code
    entrypoint :  
    - /bin/sh
    - ./test.sh
    ports:
    - "5000:5000 

其中 test.sh 是在容器内运行所需的 bash 脚本。

于 2018-06-09T18:07:43.630 回答