如果它们在不同的图像中,如何运行CMD和ENTRYPOINT脚本?



我正在使用docker多级构建,并试图为我的dockerized go应用程序添加实时重新加载功能。我有一个entrypoint。sh在第二个映像中有自己的配置。

现在,问题是来自第一个映像的命令CMD ["air", "-c", ".air.toml"]被来自第二个映像的ENTRYPOINT ["/entrypoint.sh"]脚本覆盖,因此只有ENTRYPOINT启动而CMD没有运行。

我不能像这样把它们组合成唯一的命令

ENTRYPOINT ["/entrypoint.sh", "air", "-c", ".air.toml"]

,因为第二个镜像没有安装相应库的Golang语言。

是否有可能以某种方式运行CMDENTRYPOINT并排?谢谢你。

Dockerfile

FROM golang:1.17.2
COPY . /go/src/sample
WORKDIR /go/src/sample
RUN go install github.com/go-delve/delve/cmd/dlv@latest
RUN go install github.com/cosmtrek/air@latest
CMD ["air", "-c", ".air.toml"]
FROM eclipse-temurin:17-focal
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

docker-compose.yml

version: '3'
services:
go:
build:
context: ./backend
dockerfile: Dockerfile
volumes:
- ./backend:/go/src/backend
working_dir: /go/src/backend
ports:
- 8080:8080

读取传递给入口点(即CMD)的参数

例如,下面是您的入口点脚本。你可以访问参数并对它们做一些事情,例如执行它们。
#!/bin/bash
# dome something in your entrypoint
# execute the original command
# substituting the current process id
# so that command is run with pid 1
exec "$@"

在您的docker映像中,确保您有所需的命令,即

ENTRYPOINT ["/entryppoint.sh"]
CMD ["echo", "command"]

除了这个技术方面,您似乎暗示您想要运行依赖于go可用而不go可用的CMD。这不可能。你需要确保你要执行的事情和它的依赖是可用的。

您可以从第一阶段复制air二进制文件。像这样。

COPY --from=0 /go/bin/air /usr/local/bin/air

可能,您想用CGO_ENABLED=0编译air

然而,我假设你需要go编译器在你的图像中存在任何热加载工作,因为你的应用程序需要在代码更改时重新编译。所以也许你甚至不应该在这里使用多阶段。

,说。在容器中进行热重载看起来有点像反模式。容器通常是分发工件的一种方法。

最新更新