Quero construir uma imagem docker para o projeto Linkurious no github, que requer o banco de dados Neo4j e o Node.js para ser executado.
minha primeira abordagem foi declarar uma imagem de base para minha imagem, contendo o Neo4j. Os documentos de referência não definem "imagem de base" de nenhuma maneira útil:
Imagem de base: uma imagem sem pai é uma imagem de base
do qual li que só posso ter uma imagem de base se essa imagem não tiver a própria imagem de base.
mas o que é uma imagem de base? Isso significa que se eu declarar neo4j / neo4j em uma diretiva FROM, que quando minha imagem for executada, o banco de dados neo será executado automaticamente e estará disponível no contêiner na porta 7474?
lendo a referência do Docker (consulte: https://docs.docker.com/reference/builder/#from ) Eu vejo:
FROM pode aparecer várias vezes em um único Dockerfile para criar várias imagens. Simplesmente anote a última saída de ID de imagem pelo commit antes de cada novo comando FROM.
eu quero criar várias imagens? parece que o que eu quero é ter uma única imagem que contenha o conteúdo de outras imagens, por exemplo, neo4j e node.js
Não encontrei nenhuma diretiva para declarar dependências no manual de referência. não há dependências como no RPM onde, para executar minha imagem, o contexto de chamada deve primeiro instalar as imagens de que precisa?
Estou confuso...
fonte
FROM
em aDockerfile
. Veja minha resposta editada abaixo.Respostas:
Um conjunto de arquivos, mais
EXPOSE
as portas 'dENTRYPOINT
eCMD
.Você pode adicionar arquivos e construir uma nova imagem com base nessa imagem de base, com um novo
Dockerfile
começando com umaFROM
diretiva: a imagem mencionada a seguirFROM
é "a imagem de base" para sua nova imagem.Somente se você não substituir
CMD
eENTRYPOINT
.Mas a imagem em si é suficiente: você usaria um
FROM neo4j/neo4j
se tivesse que adicionar arquivos relacionados aneo4j
para seu uso específico deneo4j
.Não: há uma proposta para remover esse "recurso" de qualquer maneira ( problema 13026 )O problema 14412 menciona:
Atualização em maio de 2017 (18 meses depois), com docker (moby) 17.05-ce .
Vários FROM podem ser usados em um único Dockerfile.
Consulte " Builder pattern vs. Multi-stage builds in Docker " (por Alex Ellis ) e PR 31257 por Tõnis Tiigi .
Antes:
Depois de:
Primeira parte do Dockerfile:
Segunda parte do mesmo (!) Dockerfile:
O resultado seria duas imagens, uma para a construção, uma com apenas o aplicativo resultante (muito, muito menor)
fonte
A primeira resposta é muito complexa, histórica e pouco informativa para o meu gosto.
Na verdade, é bastante simples. O Docker fornece uma funcionalidade chamada builds de vários estágios, a ideia básica aqui é,
Vamos começar com o primeiro. Muitas vezes você verá com algo como o Debian.
Podemos explicar tudo isso nos termos acima. O comando acima é encadeado, de modo que representa uma única alteração sem a necessidade de imagens intermediárias. Se foi escrito assim,
Isso resultaria em mais 3 imagens intermediárias temporárias. Tendo-o reduzido a uma imagem, resta um problema:
apt-get clean
não limpa os artefatos usados na instalação. Se um mantenedor do Debian incluir em sua instalação um script que modifica o sistema, essa modificação também estará presente na solução final (veja algo parecidopepperflashplugin-nonfree
para um exemplo disso).Usando uma compilação de vários estágios, você obtém todos os benefícios de uma única ação alterada, mas isso exigirá que você coloque na lista de permissões manualmente e copie os arquivos que foram introduzidos na imagem temporária usando a
COPY --from
sintaxe documentada aqui. Além disso, é uma ótima solução onde não há alternativa (como umapt-get clean
) e, de outra forma, você teria muitos arquivos desnecessários em sua imagem final.Veja também
fonte
FROM
é principalmente uma declaração de namespace. O qualificador é mais uma extensão do que uma herança. Você pode declarar vários namespaces. E cada um desses namespaces pode estender um outro namespace. @ekkis Se a outra resposta funcionar para você, continue com ela.