No momento, estou configurando um servidor HTTPS com Go usando uma assinatura autoassinada armazenada em cert.pem
e key.pem
para desenvolvimento. Sempre que executo o servidor localmente, ele funciona muito bem, permitindo que eu me conecte ao meu servidor HTTPS. No entanto, quando construo meu Dockerfile e o executo de lá, meu navegador retorna esta página:
Continuo tentando usar ADD
e COPY
com os dois arquivos no meu Dockerfile porque não tenho certeza se ele está sendo incluído no meu projeto Go depois de ser construído, mas sempre que tento construir o Dockerfile modificado, ele me dá um erro que diz que não consegue encontrar os arquivos. O comando docker que estou executando é sudo docker run -p 8080:8080 hxgo-skeleton
. Como adiciono os arquivos cert.pem
e key.pem
no meu Dockerfile para um servidor web Golang?
Arquivo Docker
# Build
FROM golang:1.23.3-alpine AS build-env
ENV APP_NAME=hxgo-skeleton
ENV CMD_PATH=cmd/api/main.go
COPY . $GOPATH/src/$APP_NAME
COPY .env $GOPATH/src/$APP_NAME
WORKDIR $GOPATH/src/$APP_NAME
# Building the Go application
RUN CGO_ENABLED=0 go build -v -o /$APP_NAME $GOPATH/src/$APP_NAME/$CMD_PATH
# Run
FROM alpine:3.14
ENV APP_NAME=hxgo-skeleton
COPY --from=build-env /$APP_NAME .
COPY .env .
EXPOSE 8080
CMD ./$APP_NAME
Você deve injetar o certificado TLS e a chave privada usando uma montagem de ligação do Docker ao executar o contêiner.
O primeiro caminho na
-v
opção é o diretório no seu sistema local onde os dados do certificado TLS residem, e o segundo caminho é o caminho no sistema de arquivos do contêiner onde seu aplicativo espera encontrá-lo. Se você estiver executando isso via Docker Compose, elevolumes:
tem uma sintaxe semelhante, exceto que ele entende caminhos relativos no lado esquerdo.Não tente incorporar o certificado TLS diretamente na imagem. Há dois bons motivos para isso. Na prática, o certificado TLS é vinculado a um nome DNS específico, então você teria que reconstruir a imagem para cada nova implantação, e normalmente você preferiria imagens que seriam reutilizadas em qualquer ambiente. Do ponto de vista da segurança, é muito fácil copiar arquivos de volta de um contêiner, e então qualquer um que tenha uma cópia da sua imagem também pode roubar sua chave privada.
De um ponto de vista mecânico, na sua construção multiestágio, após a última
FROM
linha, você é apenasCOPY --from=build
o aplicativo em si e o.env
arquivo. Nada mais estará na imagem final. Isso significa que sua imagem não conterá a cadeia de ferramentas Go (bom) e não conterá seu código-fonte (bom), mas quaisquer outros arquivos de suporte que possam estar no repositório não serão copiados. Se você precisasse deles e fosse apropriado enviá-los na imagem, você precisaria separá-COPY
los.