docker 运行 没有主机卷的本地脚本

docker run local script without host volumes

目标是在数据库容器 运行ning 后使用 curl 从下载中将数据添加到我的多容器 Web 应用程序的数据库服务器容器中。只要我使用主机卷,我就可以独立于 Web 应用程序从 docker-compose.yml 或 docker 运行 执行此操作。

如何在不使用主机卷或 Web 应用特定 Docker 文件的情况下执行此操作?

Docker 使用主机卷组成示例:

dbinit:
build: ./webtools_config/initdb
command: bash -c "/tmp/webtools_config/dbinit.sh"
volumes:
 - ./webtools_config:/tmp/webtools_config
links:
 - db1
 - db2

docker 运行 的示例,我想将 本地脚本文件传递给 docker 客户端 ,例如 . /dbinit.sh:

docker run -a stdin -a stdout -i -t \
--link dir_db1_1:db1 \
--link dir_db2_1:db2 \
initdb /bin/sh -c "./dbinit.sh"

如果我理解正确,您可以使用此脚本消除 通过构建 图像链接主机卷。

您的 Dockerfile:

# Dockerfile 
...
ADD your-script-on-host.sh /app/your-script-in-container.sh
RUN /app/your-script-in-container.sh
# Your CMD here

请注意,只有在构建图像时,您才能更新和运行此脚本。

我找到的解决方案是:

docker run tomdavidson/initdb bash -c "`cat initdb.sh`"

设置一个等于你的脚本的 ENV VAR,并将你的 Docker 图像设置为 运行 脚本(当然可以 ADD/COPY 并使用主机卷,但那不是这个问题),例如:

docker run -d -e ADD_INIT_SCRIPT="`cat custom-script.sh`" tomdavidson/debian 

tomdavidson/debian 的 CMD 运行 是一个脚本:

if [ "${ADD_INIT_SCRIPT}" != "**None**" ]; then
  echo "Executing ADD_INIT_SCRIPT ..."
  bash -c "${ADD_INIT_SCRIPT}"
fi

https://registry.hub.docker.com/u/tomdavidson/debian/