Como executo uma instância do docker a partir de um DockerFile?

94

Finalmente descobri como fazer o docker funcionar.

docker run --name my-forum-nodebb --link my-forum-redis:redis -p 80:80 -p 443:443 -p 4567:4567 -P -t -i nodebb/docker:ubuntu

Vinculei a uma instância do redis, legal.

Isso é do zero e suponho que quando criei a instância do redis

docker run --name my-forum-redis -d -p 6379:6379 nodebb/docker:ubuntu-redis

puxa a imagem de um repositório remoto?

NodeBB oferece um Dockerfile https://github.com/NodeBB/NodeBB/blob/master/Dockerfile Não tenho muita certeza de como usá-lo. Estou assumindo que posso de alguma forma criar um ambiente local chamando este Dockerfile no meu controle remoto.

Isso está correto? Se sim, como posso criar a instância local apontando para o remoto?

Michael Joseph Aubry
fonte
você pode construir a imagem docker em seu ambiente local e extraí-la localmente
BMW
$ cat Dockerfile | docker build -t <image_name> - # lembre-se do hífen
jbobbylopez

Respostas:

95

Baixe o arquivo e execute no mesmo diretório docker build -t nodebb .

Isso lhe dará uma imagem em sua máquina local chamada nodebb, a partir da qual você pode iniciar um contêiner docker run -d nodebb(você pode alterar nodebb para seu próprio nome).

Andreas Wederbrand
fonte
1
Como é que isso funciona? Se eu simplesmente tiver o dockerfile, como ele saberá sobre meu projeto? Existe um link no dockerfile? Então, suponho que, se houver docker manipulando uma nova imagem, eu poderei migrar para o meu servidor. Nessa embalagem ele absorve todos os ativos do meu projeto? Desculpe se pareço ignorante, docker é um conceito novo para mim, mas estou gostando de aprender.
Michael Joseph Aubry
2
Obrigado a propósito e o que <> representa em seu exemplo, por que você escolheu <nodebb>?
Michael Joseph Aubry,
Nenhum contêiner docker sabe sobre "seu" projeto, eles são muito genéricos.
Andreas Wederbrand
3
O comando que você forneceu não funcionou, então tentei `docker build .` e funcionou, mas como não foi nomeado, não consigo executá-lo. docker build -t <nodebb> .me dá file exists: .. Eu tenho um projeto existente que veio com um, Dockerfileentão apenas o executei dentro desse diretório.
Michael Joseph Aubry
2
Isso está respondendo a muitas das minhas perguntas, embora docs.docker.com/engine/reference/builder
Michael Joseph Aubry
45

Você não pode iniciar um contêiner a partir de um Dockerfile.

O processo é assim:

Dockerfile = [ docker build] => Docker image = [ docker run] => Docker container

Para iniciar (ou executar) um contêiner, você precisa de uma imagem. Para criar uma imagem, você precisa construir o Dockerfile [1].

[1]: você também pode obter docker importuma imagem de um tarball ou novamente docker load.

Auzias
fonte
26

Embora as respostas acima fossem utilizáveis, isso realmente me ajudou, então estou colocando-as também aqui.

Da documentação :

Em vez de especificar um contexto, você pode passar um único Dockerfile na URL ou canalizar o arquivo via STDIN. Para canalizar um Dockerfile de STDIN:

$ docker build - < Dockerfile

Com o Powershell no Windows, você pode executar:

Get-Content Dockerfile | docker build -

Quando a compilação estiver concluída, execute o comando:

docker image ls

Você verá algo assim:

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
<none>                     <none>              123456789        39 seconds ago      422MB

Copie seu ID de IMAGEM real e execute

docker run 123456789

Onde o número no final é o ID da imagem real da etapa anterior

Se não quiser lembrar o id da imagem, você pode marcar sua imagem por

docker tag 123456789 pavel/pavel-build

Que marcará sua imagem como pavel/pavel-build

Pavel Janicek
fonte
É incrível que em 2020 aquele primeiro trecho tenha demorado tanto para ser encontrado.
fullStackChris
Esta é apenas a resposta aceita com mais cerimônia.
Michail
18

A solução simples e fácil é:

docker build .
=> ....
=> Successfully built a3e628814c67
docker run -p 3000:3000 a3e628814c67

3000 - pode ser qualquer porta

a3e628814c68 - resultado hash dado pelo comando de construção de sucesso

NOTA : você deve estar dentro do diretório que contém o Dockerfile .

zhisme
fonte