Estou tentando encaixar meu aplicativo node.js. Quando o contêiner for criado, quero que ele execute um git clone
e, em seguida, inicie o servidor de nó. Portanto, coloquei essas operações em um script .sh. E execute o script como um único comando no ENTRYPOINT:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git
#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev
#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD package.json /usr/src/app/
RUN npm install
ADD docker-entrypoint.sh /usr/src/app/
EXPOSE 8080
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
Meu docker-entrypoint.sh se parece com isto:
git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git
/usr/bin/node server.js
Depois de construir esta imagem e executar:
docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>
Estou entendendo:
docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.
Eu despejo no contêiner e a permissão de docker-entrypoint.sh é:
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
três questões:
Meu script bash tem sintaxe errada?
Como altero a permissão de um arquivo bash antes de adicioná-lo a uma imagem?
Qual é a melhor maneira de executar vários comandos git no entrypoint sem usar um script bash?
Obrigado.
.sh
extensão deixa uma impressão enganosa sobre quais intérpretes podem executá-la. Você pode considerar tirar isso - não é convencional que os comandos do UNIX tenham extensões (você não executals.elf
, por exemplo).exec
uma concha assim? não precisaria dobash
prefixo.Respostas:
"Permissão negada" impede o seu script de ser invocado em tudo . Portanto, a única sintaxe possivelmente pertinente é a da primeira linha (o "shebang"), que deve ser semelhante a
#!/usr/bin/env bash
, ou#!/bin/bash
ou semelhante, dependendo do layout do sistema de arquivos de destino.Provavelmente as permissões do sistema de arquivos não foram definidas para permitir a execução. Também é possível que o shebang faça referência a algo que não é executável, mas isso é muito menos provável.
Suscitado pela facilidade de reparar os problemas anteriores.
A simples leitura de
... é que o script não está marcado como executável.
resolverá isso dentro do contêiner. Como alternativa, você pode garantir que a cópia local referenciada pelo Dockerfile seja executável e, em seguida, usar
COPY
(que é explicitamente documentado para reter metadados).fonte
noexec
sinalizador, execute embash yourscript
vez de./yourscript
.docker build
o contêiner imediato funciona bem. Mas quando eu façodocker run
, ele lança tal erro. Parece um recipiente intermediário mágico que tenho.Um arquivo executável precisa ter permissões para executar definidas antes que você possa executá-lo.
Na máquina em que você está criando a imagem do docker (não dentro da própria imagem do docker), tente executar:
A primeira coluna da saída do seu executável (neste caso docker-entrypoint.sh) deve ter os bits executáveis definidos da seguinte forma:
Se não, tente:
e, em seguida, crie sua imagem docker novamente.
O Docker usa seu próprio sistema de arquivos, mas copia tudo (incluindo bits de permissão) dos diretórios de origem.
fonte
chmod +x docker-entrypoint.sh
no host é realmente a solução recomendada, pois é muito mais simples do que alterar o seuDockerfile
.Eu enfrentei o mesmo problema e foi resolvido por
Para o Dockerfile na pergunta original, deveria ser assim:
fonte
sh
, ignorando a especificação de um interpretador; portanto, se usar#!/bin/bash
, dizendo que deseja ser interpretado com bash, isso será ignorado e será interpretado comsh
, portanto, não permitindo recursos de linguagem como[[ ]]
matrizes, etc.Se você não usa DockerFile, pode simplesmente adicionar permissão como argumento de linha de comando do bash:
fonte
Esta é uma pergunta antiga feita dois anos antes da minha resposta, vou postar o que funcionou para mim de qualquer maneira.
Em meu diretório de trabalho, tenho dois arquivos: Dockerfile e provision.sh
Dockerfile:
provision.sh:
Consegui tornar o arquivo executável no contêiner do docker definindo o arquivo fora do contêiner como executável
chmod 700 provision.sh
e em execuçãodocker build .
.fonte