Eu tenho este projeto:
script.sh
:
#!/bin/sh
echo "test"
Dockerfile
:
FROM ubuntu
RUN ["sh", "script.sh"]
Com build command docker build -t test .
, recebo este erro:
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 118B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 2.3s
=> [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
=> CACHED [1/2] FROM docker.io/library/ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44f 0.0s
=> ERROR [2/2] RUN ["sh", "script.sh"] 0.9s
------
> [2/2] RUN ["sh", "script.sh"]:
#0 0.791 sh: 0: cannot open script.sh: No such file
------
Dockerfile:2
--------------------
1 | FROM ubuntu
2 | >>> RUN ["sh", "script.sh"]
--------------------
ERROR: failed to solve: process "sh script.sh" did not complete successfully: exit code: 2
No entanto, se eu alterar o Dockerfile para:
FROM ubuntu
CMD ["sh", "script.sh"]
Então funciona:
[+] Building 1.2s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 73B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 1.0s
=> CACHED [1/1] FROM docker.io/library/ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44f 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:d9bf124a17e507c73f6defde7b046fff153fb464c2cad8a57333a0966ddf07c1 0.0s
=> => naming to docker.io/library/test 0.0s
Da diferença entre RUN e CMD em um Dockerfile :
RUN - o comando é acionado enquanto construímos a imagem do docker.
CMD - o comando é acionado enquanto iniciamos a imagem docker criada.
Ainda assim, não consigo explicar por que o RUN não funciona, mas o CMD funciona.
O Docker não contém
COPY
conteúdo implicitamente no contêiner; portanto, com seu código atual, seu contêiner não contém nenhumscript.sh
arquivo.Considere em vez disso:
Como você não está executando
sh
, a escolha do interpretador do script (#!/bin/sh
,#!/usr/bin/bash
,#!/usr/bin/env zsh
,#!/usr/bin/env python
ou qualquer outra coisa que ele queira) será respeitada. (É uma boa prática descartar a.sh
extensão, portanto, se você reescrever posteriormente para uma linguagem não-shell, não precisará escolher entre alterar a convenção de chamada e ter um nome de arquivo enganoso).Observe que isso exige que seu script tenha permissões executáveis e uma linha shebang válida; você pode precisar usar
chmod +x
se isso não acontecer.