首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多个dockerfile使用共享dockerfile

对多个dockerfile使用共享dockerfile
EN

Stack Overflow用户
提问于 2021-09-18 12:59:00
回答 4查看 543关注 0票数 2

我所拥有的是多个相似和简单的dockerfile

但是我想要的是有一个单基dockerfile,我的dockerfile将它们的变量传递给它。

在我的例子中,dockerfile之间唯一的区别仅仅是它们的EXPOSE,所以我认为最好保持基本dockerfile和其他dockerfile只像模板引擎那样将这些变量注入基本dockerfile

一个样本dockerfile

代码语言:javascript
复制
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o /bin/app ./cmd/root.go

FROM alpine:latest
WORKDIR /bin/
COPY --from=builder /bin/app .
EXPOSE 8080
LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-auth"
ENTRYPOINT ["/bin/app"]
CMD ["server", "--env=dev"]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-09-19 04:50:50

正如yasen所说,不可能有进口指令。

最后,我所做的如下:指向github存储库的链接

  1. 使用EXPOSE ${{ EXPOSED_PORT }}创建模板文本文件
代码语言:javascript
复制
FROM golang:1.17 AS builder

WORKDIR /app

COPY . .

RUN go mod download && make ent-generate

RUN go build -o /bin/app ./cmd/root.go

FROM alpine:latest

WORKDIR /bin/

COPY --from=builder /bin/app .

EXPOSE ${{ EXPOSED_PORT }}

LABEL org.opencontainers.image.source="https://github.com/mohammadne/bookman-library"

ENTRYPOINT ["/bin/app"]

CMD ["server", "--env=dev"]
  1. 然后创建一个python脚本
代码语言:javascript
复制
#!/usr/bin/python
from shutil import copyfile
import os


class Config:
    def __init__(self, service, port):
        self.service = service
        self.port = port


configs = [
    Config("auth", "8080"),
    Config("user", "8081"),
    Config("library", "8082"),
]

pathToDir = "../build"
template = f"{pathToDir}/template.txt"

for config in configs:
    outputDir = f"{pathToDir}/{config.service}"
    os.mkdir(outputDir)

    fileName = copyfile(template, f"{outputDir}/Dockerfile")

    with open(fileName, "rt") as file:
        replacedText = file.read().replace('${{ EXPOSED_PORT }}', config.port)

    with open(fileName, "wt") as file:
        file.write(replacedText)

然后在python脚本中您可以替换您的模式!

票数 2
EN

Stack Overflow用户

发布于 2021-09-18 14:20:31

IMPORT指令永远不会实现

很久以前,有人提出了IMPORTDocker指令。

不幸的是,在公共关系尚未解决的情况下,问题仍未解决:

你的案子的解决办法

但就你的情况而言,你所需要的只是一点sed

例如:

代码语言:javascript
复制
# Case1: inplace templating
EXPOSED_PORT=8081 sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile

# Case2: generating Dockerfile from template
sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > Dockerfile

解释:

  • EXPOSED_PORT=8081声明本地bash变量
  • sed是一种文本操作工具。
  • sed -i "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" DockerfileEXPOSE 8080替换为EXPOSE 8081
  • sed "s/EXPOSE 8080/EXPOSE $EXPOSED_PORT/" Dockerfile.template > DockerfileDockerfile.template生成新的Dockerfile
票数 4
EN

Stack Overflow用户

发布于 2021-09-18 16:29:18

您可以将公开的端口作为映像的构建参数。如果你做了一个像这样的文件

代码语言:javascript
复制
FROM alpine:latest
ARG EXPOSED_PORT
EXPOSE ${EXPOSED_PORT}

通过传递端口号,可以指定生成时公开的端口,如下所示

代码语言:javascript
复制
docker build -t myimage --build-arg EXPOSED_PORT=8000 .

值得注意的是,公开语句主要是文档。您的图像将在不使用image语句的情况下正常工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69234878

复制
相关文章

相似问题

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