首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在不运行容器的情况下向容器发送命令以更改文件?

如何在不运行容器的情况下向容器发送命令以更改文件?
EN

Stack Overflow用户
提问于 2021-05-07 14:57:28
回答 2查看 195关注 0票数 0

我有一个容器Postgres,它在它的Dockerfile中启动一个docker-entrypoint.sh,在该文件中有一个命令,我想使用这个命令删除它:

代码语言:javascript
代码运行次数:0
运行
复制
sed -i 's/exec "$@"//g' docker-entrypoint.sh

目标是能够使用修改后的docker-entrypoint.sh (没有exec "@")运行容器。

如何使用之前启动的命令运行容器?我使用了另一种方法,使用另一个没有“exec”@“”的shell文件重写docker-entrypoint.sh,然后使用以下命令挂载它以运行容器:

代码语言:javascript
代码运行次数:0
运行
复制
docker run -v $(pwd):/docker-entrypoint-initdb.d -e POSTGRES_PASSWORD=password \
     --entrypoint="docker-entrypoint-initdb.d/docker-entrypoint-custom.sh" postgres postgres

我确信在bash中运行命令之前还有更好的方法,然后运行我自己的命令。

我试过这样的方法,但不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-07 15:08:36

我使用了另一种方法,用另一个没有“exec”@“”的shell文件覆盖docker-entrypoint.sh。

好吧,你正在挂载一个完整的目录,你有一个入口点的副本。只需挂载一个文件,并在文件中进行修改。

代码语言:javascript
代码运行次数:0
运行
复制
# docker-entrypoint-custom.sh
#!/bin/sh
# do the modification
sed -i 's/exec "$@"//g' /docker-entrypoint.sh
# Just run it
/docker-entrypoint.sh "$@"

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

另一种方法是使用修改后的入口点构建另一个容器。

代码语言:javascript
代码运行次数:0
运行
复制
# Dockefile....
FROM postgres
RUN sed -i 's/exec "$@"//g' /docker-entrypoint.sh
票数 1
EN

Stack Overflow用户

发布于 2021-05-07 16:56:02

postgres映像所做的默认事情是运行postgres。如果希望它运行其他命令,只需将该命令放在docker run命令的末尾即可。不要担心编辑入口点脚本。

为了调试目的,需要做的一件非常典型的事情是启动一个交互式shell,而不是普通的服务器进程;然后,您可以查看创建的文件系统,看看发生了什么。

代码语言:javascript
代码运行次数:0
运行
复制
docker run --rm -it \
  -v $PWD:/docker-entrypoint-initdb.d \
  -e POSTGRES_PASSWORD=password \
  postgres \
  /bin/bash

这到底是怎么回事?如果您查看图像的Dockerfile,您会注意到它包含一个ENTRYPOINT和一个CMD

代码语言:javascript
代码运行次数:0
运行
复制
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]

当你同时拥有两样东西的时候,ENTRYPOINTexec "$@"行用另一个由位置参数组成的命令替换入口点脚本;也就是说,它将docker-entrypoint.sh替换为postgres。在命令行中覆盖CMD很容易,就像我前面所做的那样,但是替换ENTRYPOINT更困难。

这就形成了一种通用模式,即使用ENTRYPOINT进行首次初始化,然后使用exec "$@"运行CMD

代码语言:javascript
代码运行次数:0
运行
复制
#!/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 "$@"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67437273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档