我有一个容器Postgres
,它在它的Dockerfile中启动一个docker-entrypoint.sh
,在该文件中有一个命令,我想使用这个命令删除它:
sed -i 's/exec "$@"//g' docker-entrypoint.sh
目标是能够使用修改后的docker-entrypoint.sh (没有exec "@")运行容器。
如何使用之前启动的命令运行容器?我使用了另一种方法,使用另一个没有“exec”@“”的shell文件重写docker-entrypoint.sh,然后使用以下命令挂载它以运行容器:
docker run -v $(pwd):/docker-entrypoint-initdb.d -e POSTGRES_PASSWORD=password \
--entrypoint="docker-entrypoint-initdb.d/docker-entrypoint-custom.sh" postgres postgres
我确信在bash中运行命令之前还有更好的方法,然后运行我自己的命令。
我试过这样的方法,但不起作用:
docker run --rm -v $PWD:/docker-entrypoint-initdb.d -e POSTGRES_PASSWORD=password --entrypoint=/bin/bash postgres sed -i 's/exec "$@"//g' docker-entrypoint.sh && postgres docker-entrypoint.sh
发布于 2021-05-07 15:08:36
我使用了另一种方法,用另一个没有“exec”@“”的shell文件覆盖docker-entrypoint.sh。
好吧,你正在挂载一个完整的目录,你有一个入口点的副本。只需挂载一个文件,并在文件中进行修改。
# docker-entrypoint-custom.sh
#!/bin/sh
# do the modification
sed -i 's/exec "$@"//g' /docker-entrypoint.sh
# Just run it
/docker-entrypoint.sh "$@"
$ docker run --rm \
-v $PWD/docker-entrypoint-custom.sh:/docker-entrypoint-custom.sh:ro \
-e POSTGRES_PASSWORD=password \
--entrypoint=/docker-entrypoint-custom.sh \
postgres postgres
另一种方法是使用修改后的入口点构建另一个容器。
# Dockefile....
FROM postgres
RUN sed -i 's/exec "$@"//g' /docker-entrypoint.sh
发布于 2021-05-07 16:56:02
postgres
映像所做的默认事情是运行postgres
。如果希望它运行其他命令,只需将该命令放在docker run
命令的末尾即可。不要担心编辑入口点脚本。
为了调试目的,需要做的一件非常典型的事情是启动一个交互式shell,而不是普通的服务器进程;然后,您可以查看创建的文件系统,看看发生了什么。
docker run --rm -it \
-v $PWD:/docker-entrypoint-initdb.d \
-e POSTGRES_PASSWORD=password \
postgres \
/bin/bash
这到底是怎么回事?如果您查看图像的Dockerfile,您会注意到它包含一个ENTRYPOINT
和一个CMD
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
当你同时拥有两样东西的时候,ENTRYPOINT
。exec "$@"
行用另一个由位置参数组成的命令替换入口点脚本;也就是说,它将docker-entrypoint.sh
替换为postgres
。在命令行中覆盖CMD
很容易,就像我前面所做的那样,但是替换ENTRYPOINT
更困难。
这就形成了一种通用模式,即使用ENTRYPOINT
进行首次初始化,然后使用exec "$@"
运行CMD
。
#!/bin/sh
# I am docker-entrypoint.sh
# Invoke me in a Dockerfile as (must use JSON-array syntax)
# ENTRYPOINT ["/path/to/entrypoint.sh"]
# Do startup-time initialization, like creating a database or
# setting environment variables for the main process
...
# Then launch the CMD
exec "$@"
https://stackoverflow.com/questions/67437273
复制相似问题