2 回答

TA贡献1798条经验 获得超3个赞
编辑:
验证您在bitbucket.org中的远程存储库是否确实具有v0.0.7
您尝试构建的标签。
如果 git 标签在本地存在,则本地构建可能会工作 - docker 构建将从远程源中提取并失败并出现错误,例如go.mod at revision v0.0.7: unknown revision v0.0.7
- 如果标签不存在远程。
要将本地标签推送到远程仓库:
git push --tags
有关更精细的标记操作,请参阅。
默认情况下,Docker 构建只能访问公共存储库。由于您需要访问私有仓库,因此您需要在Docker构建过程中包含一个 read-ssh 密钥(永远不要将密钥签入仓库!)。
然而,这是非常重要的,您在多阶段构建中执行此操作,因此您不会在最终映像中包含您的 SSH 密钥。
这篇博文介绍了所有步骤。但要包括一个工作示例:
构建 docker 镜像:
SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" \
docker build -t "myapp:v0.0.1" --build-arg SSH_PRIVATE_KEY .
并Dockerfile使用bitbucket.org私人回购网站:
FROM golang:1.14.6 AS build
WORKDIR /bld
COPY *.go go.mod go.sum ./
ARG SSH_PRIVATE_KEY
# ***NEVER*** DO THIS IN A SINGLE-STAGE DOCKER BUILD (see below)
RUN \
mkdir -p ~/.ssh && \
umask 0077 && \
echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa && \
git config --global url."git@bitbucket.org:".insteadOf https://bitbucket.org/ && \
ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
RUN \
go get && \
CGO_ENABLED=0 go build -o app
# final stage of multi-stage: will appropriately *NOT* include SSH keys
FROM scratch
COPY --from=build \
/etc/ssl /etc/ssl
COPY --from=build \
/bld/app /app/myapp
CMD ["/app/myapp"]

TA贡献1818条经验 获得超8个赞
这里有两个问题需要解决:
1. 如何让 Docker 安全地访问本地 SSH 密钥?
2. 如何告诉 Go 不要使用公共注册表来获取私有包?
简短的答案
从Docker v18.09 开始,有一个内置的解决方案可以在构建阶段处理 SSH 身份验证(更多)。与传递构建参数相比,它也更容易、更安全,并且无需多阶段 Docker 构建。
Go 有一个
GOPRIVATE
环境变量来识别私有包。(更多)
长答案
一步步:
1. 确保ssh-agent
已设置并知道 SSH 密钥
Github 有一个关于这个主题的快速指南,解释了不同操作系统的过程。请参阅生成新的 SSH 密钥并将其添加到 SSH 代理。
2. 为 Docker 启用 BuildKit
没有BuildKit,docker build
将无法识别--ssh
选项。
来自Docker 参考:
全新安装 docker 最简单的方法是
DOCKER_BUILDKIT=1
在调用 docker build 命令时设置环境变量,例如:$ DOCKER_BUILDKIT=1 docker build .要默认启用 docker BuildKit,请将功能中的守护进程配置设置
/etc/docker/daemon.json
为 true 并重新启动守护进程:{ "features": { "buildkit": true } }
Docker Desktop 用户可以通过Preferences > Docker Engine管理守护进程配置。
4.更新Dockerfile
4.1。确保 Git 使用 SSH 而不是 HTTPS
Go 倾向于通过HTTPs
. git
您可以通过更新配置来调整此行为:
RUN git config --global url.git@github.com:.insteadOf https://github.com/
您可能也应该在本地计算机上执行此操作。
4.2. 在需要的地方请求 SSH 访问
需要 SSH 访问的每个RUN
命令都应使用type=ssh
. 为了
例子:
RUN --mount=type=ssh git clone ...
4.3. 确保 Go 知道你的私有包
更新GOPRIVATE
变量:
RUN go env -w GOPRIVATE="github.com/your-org/private-repo"
将所有这些放在一起,在以下 Dockerfile 示例中:
FROM golang:1.16.3-alpine3.13
RUN apk update
RUN apk add git openssh
RUN mkdir /app
ADD . /app
WORKDIR /app
# You can replace github.com with any other Git host
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
# Make sure git uses SSH to fetch packages, not HTTPs
RUN git config --global url.git@github.com:.insteadOf https://github.com/
# Make Go knows which packages are private.
RUN go env -w GOPRIVATE="github.com/your-org/private-repo"
# GOPRIVATE is a comma separated list glob-patterns.
# You can use a wildcard to match every repo in an organization:
# e.g.: GOPRIVATE="github.com/your-org/*"
# Mount the build command with type `ssh`.
RUN --mount=type=ssh go get && go build -o main .
CMD ["/app/main"]
6. 使用选项构建镜像--ssh:
默认启用 BuildKit:
$ docker build --ssh default -t my-app:latest .
- 2 回答
- 0 关注
- 241 浏览
添加回答
举报