Estou tentando dockerize um aplicativo php. No arquivo docker, eu baixa o arquivo, extraio-o etc.
Tudo funciona bem, no entanto, se uma nova versão for lançada e eu atualizar o arquivo docker, tenho que reinstalar o aplicativo, porque o config.php é substituído.
Então, pensei em montar o arquivo como um volume, como faço com o banco de dados.
Eu tentei de duas maneiras, com um volume e um caminho direto.
docker-compor:
version: '2'
services:
app:
build: src
ports:
- "8080:80"
depends_on:
- mysql
volumes:
- app-conf:/var/www/html/upload
- app-conf:/var/www/html/config.php
environment:
DB_TYPE: mysql
DB_MANAGER: MysqlManager
mysql:
image: mysql:5.6
container_name: mysql
volumes:
- mysqldata:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
volumes:
mysqldata:
app-conf:
O que resulta no erro:
E eu tentei com um determinado caminho, como um volume montado.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
No entanto, os dois lados não estão funcionando. Com o volume montado, vejo que o upload é criado.
Mas então falha com
/var/www/html/config.php \\ "causou \\" não um diretório \\ "\" "
Se eu tentar com
/src/docker/myapp/upload/config.php:/var/www/html/config.php
O Docker cria a pasta de upload e, em seguida, uma pasta config.php. Não é um arquivo.
Ou existe outra maneira de persistir na configuração?
fonte
Respostas:
Os volumes de arquivos são feitos dessa maneira no docker (exemplo de caminho absoluto (pode usar variáveis env) e você precisa mencionar o nome do arquivo):
Você também pode fazer:
Se você disparar a janela de encaixe-compor da
/src/docker/myapp
pastafonte
Eu estava sofrendo de um problema semelhante. Eu estava tentando importar meu arquivo de configuração para o meu contêiner, para que eu possa corrigi-lo toda vez que precisar, sem reconstruir a imagem.
Quero dizer, pensei que o comando abaixo fosse
$(pwd)/config.py
mapeado do host do Docker para/root/app/config.py
o contêiner como um arquivo.No entanto, sempre criou um diretório chamado
config.py
, não um arquivo.enquanto procurava por pistas, encontrei o motivo ( daqui )
Portanto, ele sempre é criado como um diretório porque o meu host de docker não possui
$(pwd)/config.py
.Mesmo se eu criar o config.py no host do docker.
$(pwd)/config.py
apenas exagere na/root/app/config.py
exportação/root/app/config.py
.fonte
touch path/to/file
noDockerfile
modo que quando eu montá-lo ainda seria um arquivo (não é um dir criado):
tem que ser o caminho completo. Funciona assimtouch
resposta foi a seguinte: faça isso no Dockerfile para que o seu volume de docker-componha a montagem funcione corretamente sem criar um diretórioUse mount (
--mount
) em vez de volume (-v
)Mais informações: https://docs.docker.com/storage/bind-mounts/
Exemplo:
Verifique se /tmp/a.txt existe no host do docker
fonte
--mount
e-v
é o comportamento quando parte do host do volume ainda não existe. Conforme o seu link:> Se você usar -v ou --volume para montar um arquivo ou diretório que ainda não exista no host do Docker, -v criará o terminal para você. É sempre criado como um diretório.Para quem usa contêiner do Windows como eu, saiba que NÃO PODE vincular ou montar arquivos únicos usando o contêiner do Windows.
É difícil de detectar, mas está lá
Link para o problema do Github referente ao mapeamento de arquivos no contêiner do Windows
fonte
A maneira que funcionou para mim é usar uma
bind
montagemObrigado mike breed pela resposta em: Montar um único arquivo a partir do volume usando o docker-compose
Você precisa usar a "sintaxe longa" para expressar uma
bind
montagem: https://docs.docker.com/compose/compose-file/#long-syntaxfonte
No arquivo docker-compose versão 3.2, você pode especificar uma montagem de volume do tipo "bind" (em vez do tipo padrão "volume") que permite montar um único arquivo no contêiner. Procure por "montagem de ligação" nos documentos do volume de encaixe / composição: https://docs.docker.com/compose/compose-file/#volumes
No meu caso, eu estava tentando montar um único arquivo ".secrets" no meu aplicativo que continha segredos apenas para desenvolvimento e teste local. Na produção, meu aplicativo busca esses segredos da AWS.
Se eu montei esse arquivo como um volume usando a sintaxe abreviada:
O Docker criaria um diretório ".secrets" dentro do contêiner, em vez de mapear para o arquivo fora do contêiner. Meu código geraria um erro como "IsADirectoryError: [Erro 21] É um diretório: '.secrets'".
Corrigi isso usando a sintaxe da mão longa, especificando meu arquivo de segredos usando uma montagem de volume "bind" somente leitura:
Agora, o Docker monta corretamente meu arquivo .secrets no contêiner, criando um arquivo dentro do contêiner, em vez de um diretório. Espero que outros achem este exemplo útil!
fonte
Você também pode usar um caminho relativo para seu
docker-compose.yml
arquivo como este (testado no host do Windows, contêiner Linux):fonte
version: '3.7'
especificado nodocker-compose.yml
arquivo com docker-compose versão 1.24.1, compilação 4667896b e funcionou.Para mim, o problema era que eu tinha um link simbólico quebrado no arquivo que estava tentando montar no contêiner
fonte
Eu tive o mesmo problema no Windows
Docker 18.06.1-ce-win73 (19507)
,.Remover e adicionar novamente a unidade compartilhada através do painel de configurações do Docker e tudo funcionou novamente.
fonte
No Windows, se você precisar da variável env $ {PWD} em seu docker-compose.yml, poderá criar um arquivo .env no mesmo diretório que o arquivo docker-compose.yml e inserir manualmente o local da sua pasta.
CMD (pwd_var.bat):
PowerShell (pwd_var.ps1):
Há mais recursos bons para as variáveis .env do docker-compose: https://docs.docker.com/compose/reference/envvars/, especialmente para a
COMPOSE_CONVERT_WINDOWS_PATHS
variável env que permite que o docker compose aceite o caminho do Windows com barra de ataque"\"
.Quando você deseja compartilhar um arquivo no Windows, o arquivo deve existir antes de compartilhá-lo com o contêiner.
fonte
Talvez isso ajude alguém.
Eu tive esse problema e tentei de tudo. As ligações de volume pareciam bem e, mesmo que eu montei o diretório (não os arquivos), eu tinha os nomes dos arquivos no diretório montado corretamente, mas montados como dirs.
Tentei reativar unidades compartilhadas e o Docker reclamou que o firewall está ativo.
Depois de desativar o firewall, tudo estava funcionando bem.
fonte
Você pode montar arquivos ou diretórios / pastas, tudo depende do arquivo ou diretório de origem. E você também precisa fornecer o caminho completo ou, se não tiver certeza, pode usar o PWD. Aqui está um exemplo simples de trabalho.
Neste exemplo, estou montando o arquivo env-command que já existe no meu diretório de trabalho
fonte
Tenho o mesmo problema no meu Windows 8.1
Descobriu-se que era devido à distinção entre maiúsculas e minúsculas do caminho. Liguei
docker-compose up
do diretóriocd /c/users/alex/
e, dentro do contêiner, um arquivo foi transformado em diretório.Mas quando eu fiz
cd /c/Users/alex/
(e não os Usuários em maiúscula) e ligueidocker-compose up
de lá, funcionou.No meu sistema, tanto o diretório Users quanto o Alex dir estão em maiúsculas, embora pareça que apenas o diretório Users seja importante.
fonte