【问题标题】:Docker build step name cannot start with numberDocker 构建步骤名称不能以数字开头
【发布时间】:2020-10-31 15:18:27
【问题描述】:

我正在为 Sybase 数据库构建 docker 映像。 Docker build 命令失败,因为构建步骤“服务器”的名称不能以数字开头。

我已经搜索了很多方法来更改构建步骤机器的名称,到目前为止我的解决方案是重试构建,直到我得到一个以字母开头的名称...

Step 1/7 : FROM my_image as docker_sybase_db
 ---> d266899b4eef
Step 2/7 : COPY *.zip /mnt/backup/
 ---> Using cache
 ---> 9e8e405848ce
Step 3/7 : COPY entrypoint.sh ~
 ---> Using cache
 ---> 5c0c923985db
Step 4/7 : ENV HOSTNAME docker_sybase_db
 ---> Using cache
 ---> f2b39a7280a0
Step 5/7 : RUN init_db.sh
 ---> Running in 0ae1a95b3203
Server name '0ae1a95b3203' begins with an illegal character.  The first
character of a server name must be an alphabetic ascii character.
Error running command 'srvbuild -r /tmp/my_super_build.rs': 

如果我不能修改这个旧的 sybase 初始化脚本,我是不是运气不好?

编辑:这是我想要做的事情

  1. 创建数据库实例
  2. 加载备份
  3. 将预加载的实例打包到容器中。

加载备份需要很长时间,而且这个旧数据库系统要求服务器名称以字母开头,而不是数字。

【问题讨论】:

  • init_db.sh 里面有什么?我的意思是为什么你的脚本将 docker 层号作为服务器名称?
  • 是的,这是来自 SAP infocenter.sybase.com/help/index.jsp?topic=/…的命令
  • 标准 Docker Hub 数据库映像在实际容器运行之前不会尝试设置数据库。您能否将这一步推迟到那时(如果尚未完成,则使用入口点包装脚本进行初始化)?然后你可以docker run --hostname 设置容器认为它的主机名是什么。
  • Docker 运行 --hostname 是不可能的。我需要在映像构建中运行此步骤,因为我不想每次都进行大约 10 分钟的预处理。

标签: docker dockerfile


【解决方案1】:

您可以尝试看看LolHensidea of changing the hostname in the container namespace(在 docker 构建期间)是否适合您。

docker build . | tee >((grep --line-buffered -Po '(?<=^change-hostname ).*' || true) | \
                       while IFS= read -r id; do \
                         nsenter --target "$(docker inspect -f '{{ .State.Pid }}' "$id")"\
                                 --uts hostname 'new-hostname'; \
                       done)

docker build 输出被解析为:

这意味着您的RUN 步骤应该是:

RUN echo "change-hostname $(hostname)"; \
    sleep 1; \
    printf '%s\n' "$(hostname)" > /etc/hostname; \
    printf '%s\t%s\t%s\n' "$(perl -C -0pe 's/([\s\S]*)\t.*$/$1/m' /etc/hosts)" "$(hostname)" > /etc/hosts; \
    init_db.sh

这样,init_db.sh 应该在具有不同主机名的中间容器中运行(您可以控制它,并且不会以数字开头)。

【讨论】:

  • 我不认为这对我有用,该命令需要在 windows、linux、TFS 和 azure devops 管道上运行。这将支持许多不同的命令,我认为我不会使用这种方法。不过,这是一种非常有创意的方式,希望它对我有用!
  • @A_V 我在阅读您的原始问题时不知道这种多平台限制。不过,它应该可以在任何地方通过需要的 Linux VM 工作。
  • 这对我不起作用,我不得不去编辑一些非常旧的遗留脚本以使其最终能够正常工作,但老实说,这对我来说足够有创意,可以接受答案。没有比这更好的了。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多