Copiei esse código do que parece ser vários arquivos docker de trabalho, aqui está o meu:
FROM ubuntu
MAINTAINER Luke Crooks "[email protected]"
# Update aptitude with new repo
RUN apt-get update
# Install software
RUN apt-get install -y git python-virtualenv
# Make ssh dir
RUN mkdir /root/.ssh/
# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh
# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Remove host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config
# Clone the conf files into the docker container
RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
Isso me dá o erro
Step 10 : RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128
É a primeira vez que uso dockerfiles, mas pelo que li (e extraí das configurações de trabalho) não consigo ver por que isso não funciona.
Meu id_rsa está na mesma pasta que meu dockerfile e é uma cópia da minha chave local que pode clonar este repositório sem problemas.
Editar:
No meu dockerfile, posso adicionar:
RUN cat /root/.ssh/id_rsa
E ela imprime a chave correta, para que eu saiba que está sendo copiada corretamente.
Também tentei fazer o que Noé recomendou e corri:
RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config
Infelizmente, isso também não funciona.
ssh-keyscan
o tempo limite padrão é de 5 segundos, que o bitbucket geralmente excede.ssh-keyscan
nem relatará um erro. Então é melhor correrRUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts
para estar seguro.ssh-keyscan
é um problema? Meu entendimento é que ele simplesmente puxará a chave pública do Github / Bitbucket. Que alternativa pode ser usada para não acabar em uma camada?known_hosts
arquivo. As pessoas apenas votam aleatoriamente quando soam alarmantes o suficiente.Você deve criar um novo conjunto de chaves SSH para essa imagem do Docker, pois provavelmente não deseja incorporar sua própria chave privada. Para fazê-lo funcionar, você precisará adicionar essa chave às chaves de implantação no seu repositório git. Aqui está a receita completa:
Gere chaves ssh com as
ssh-keygen -q -t rsa -N '' -f repo-key
quais você fornecerá os arquivos repo-key e repo-key.pub.Adicione repo-key.pub às chaves de implantação do repositório.
No GitHub, vá para [seu repositório] -> Configurações -> Implementar chaves
Adicione algo assim ao seu Dockerfile:
Observe que acima desativa o StrictHostKeyChecking, assim você não precisa de .ssh / known_hosts. Embora eu provavelmente goste mais da solução com o ssh-keyscan em uma das respostas acima.
fonte
fatal: Could not read from remote repository.
Não é necessário mexer nas configurações ssh. Use um arquivo de configuração (não um arquivo Docker) que contenha variáveis de ambiente e faça com que um script de shell atualize seu arquivo docker em tempo de execução. Você mantém os tokens fora dos arquivos do Docker e pode clonar por https (não é necessário gerar ou passar chaves ssh).
Vá para Configurações> Tokens de acesso pessoal
repo
escopo ativado.git clone https://[email protected]/user-or-org/repo
Alguns comentadores observaram que, se você usar um Dockerfile compartilhado, isso poderá expor sua chave de acesso a outras pessoas em seu projeto. Embora isso possa ou não ser uma preocupação para o seu caso de uso específico, aqui estão algumas maneiras de lidar com isso:
sed
ou similar, ou seja, chamando o script pelosh rundocker.sh MYTOKEN=foo
qual a substituição seria ativadahttps://{{MY_TOKEN}}@github.com/user-or-org/repo
. Observe que você também pode usar um arquivo de configuração (em .yml ou em qualquer formato que desejar) para fazer a mesma coisa, mas com variáveis de ambiente.fonte
Settings > Applications
?Outra opção é usar uma janela de encaixe de vários estágios para garantir que suas chaves SSH não sejam incluídas na imagem final.
Conforme descrito no meu post, você pode preparar sua imagem intermediária com as dependências necessárias para o git clone e, em seguida,
COPY
os arquivos necessários na sua imagem final.Além disso, se tivermos
LABEL
nossas camadas intermediárias, podemos excluí-las da máquina quando terminar.Podemos então construir:
Prove que nossas chaves SSH se foram:
Limpe imagens intermediárias da máquina de construção:
fonte
RUN
para não deixar a chave na camada de imagem anterior. Na janela de encaixe,1.13
você pode usar o argumento--squash
experimental que também removeria a chave SSH nas camadas finais da imagem.Para o repositório de bitbucket, gere a Senha do aplicativo (Configurações de Bitbucket -> Gerenciamento de acesso -> Senha do aplicativo, veja a imagem) com acesso de leitura ao repositório e projeto.
Em seguida, o comando que você deve usar é:
fonte
--recursive
não funcionou. Eu tive que colocargit clone
para cada submódulo, o que é bom, mas teria sido ótimo se tivesse funcionado recursivamente.Geralmente, você não deseja executar um
git clone
repo particular de dentro da construção da janela de encaixe. Fazer o clone lá envolve colocar as credenciais ssh privadas dentro da imagem, para que possam ser extraídas posteriormente por qualquer pessoa com acesso à sua imagem.Em vez disso, a prática comum é clonar o repositório git de fora da janela de encaixe na sua ferramenta de CI preferida e simplesmente
COPY
os arquivos na imagem. Isso tem um segundo benefício: cache do docker. O armazenamento em cache do Docker examina o comando que está sendo executado, as variáveis de ambiente que ele inclui, os arquivos de entrada etc., e se eles são idênticos a uma compilação anterior da mesma etapa pai, reutilizam esse cache anterior. Com umgit clone
comando, o próprio comando é idêntico; portanto, o docker reutilizará o cache, mesmo que o repositório git externo seja alterado. No entanto, umCOPY
comando examinará os arquivos no contexto de construção e poderá ver se eles são idênticos ou foram atualizados e usará o cache somente quando for apropriado.Se você deseja adicionar credenciais à sua compilação, considere fazê-lo com uma compilação de vários estágios e apenas coloque essas credenciais em um estágio inicial que nunca seja marcado e enviado para fora do host da compilação. O resultado se parece com:
Mais recentemente, o BuildKit testou alguns recursos experimentais que permitem passar uma chave ssh como uma montagem que nunca é gravada na imagem:
E você pode criar isso com:
Observe que isso ainda exige que sua chave ssh não seja protegida por senha, mas você pode pelo menos executar a compilação em um único estágio, removendo um comando COPY e evitando que a credencial ssh faça parte de uma imagem.
O BuildKit também adicionou um recurso apenas para ssh, que permite que você ainda tenha suas chaves ssh protegidas por senha; o resultado é o seguinte:
E você pode criar isso com:
Novamente, isso é injetado na compilação sem nunca ser gravado em uma camada de imagem, eliminando o risco de a credencial vazar acidentalmente.
Para forçar o docker a executar o
git clone
mesmo quando as linhas anteriores foram armazenadas em cache, você pode injetar um ARG de compilação que muda a cada compilação para interromper o cache. Isso se parece com:Em seguida, você injeta a alteração do argumento no comando docker build:
fonte
As soluções acima não funcionaram para o bitbucket. Achei que isso funciona:
fonte