J'ai essayé de créer ma propre image de base busybox.
# ./mkimage.sh -t pensu/busybox busybox-static
+ mkdir -p /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ tar --numeric-owner -caf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs.tar.xz -C /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs '--transform=s,^./,,' .
+ cat > '/var/tmp/docker-mkimage.US3tHy0uBQ/Dockerfile'
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ docker build -t pensu/busybox /var/tmp/docker-mkimage.US3tHy0uBQ
Sending build context to Docker daemon 863.2 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
--->
Step 1 : ADD rootfs.tar.xz /
---> 8eac78bfc9d6
Removing intermediate container ad9bbb8f7536
Successfully built 8eac78bfc9d6
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ
Je peux voir que l'image est disponible avec mon dépôt Docker.
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pensu/busybox latest 8eac78bfc9d6 7 seconds ago 2.476 MB
Mais quand j'essaie de faire tourner Docker, j'obtiens toujours l'erreur:
# docker run -it pensu/busybox /bin/sh
exec: "/bin/sh": stat /bin/sh: no such file or directorytime="2015-04-09T16:03:45+05:30" level="fatal" msg="Error response from daemon: Cannot start container 8fe73b7832193c847d7975175a4be86d1f0b550b6a00b812bd4cdd18fe752468: exec: \"/bin/sh\": stat /bin/sh: no such file or directory"
Je ne suis pas capable de comprendre pourquoi donne-t-il cette erreur? Est-ce que je fais quelque chose de mal? Sinon, comment puis-je valider la création d'une image correcte en état de marche?
Après avoir créé une image, vérifiez-la avec:
$ docker inspect $ nom_image
et vérifiez ce que vous avez dans l'option CMD, pour les boîtes occupées, il devrait s'agir de: "Cmd": [ "/bin/sh"[.____._rev écrasent l'option CMD dans votre ./mkimage.sh
J'ai frappé cette erreur ("stat/bin/bash: aucun fichier ni répertoire") lors de l'exécution de la commande:
docker exec -it 80372bc2c41e /bin/bash
La solution consistait à identifier le type de terminal (ou Shell) disponible sur le conteneur. Pour ce faire, j'ai couru:
docker inspect 80372bc2c41e
Dans la sortie de cette commande, j'ai vu:
"Cmd": [
"/bin/sh",
"-c",
"gunicorn -b 0.0.0.0:7082 server.app:app"
],
Cela me dit qu'il existe une commande /bin/sh
disponible et que j'ai pu me connecter avec:
docker exec -it 80372bc2c41e /bin/sh
Cette erreur
docker: réponse d'erreur du démon: la création du moteur d'exécution OCI a échoué: container_linux.go: 348: le démarrage du processus de conteneur a provoqué "exec: \"/bin/sh\": stat/bin/sh: pas de fichier ou répertoire ": inconnu.
se produit lors de la création d'une image de menu fixe à partir d'une image de base, par exemple. scratch
. Cela est dû au fait que l'image résultante n'a pas de shell pour exécuter l'image. Si votre utilisation:
ENV EXECUTABLE hello
cmd [$EXECUTABLE]
dans votre fichier docker, docker utilise/bin/sh pour analyser la chaîne d'entrée. et par conséquent l'erreur. En inspectant l'image, vous trouverez:
$docker inspect <image-name>
"Entrypoint": [
"/bin/sh",
"-c",
"[$HM_APP]"
]
Cela signifie que les arguments ENTRYPOINT ou CMD seront analysés à l'aide de/bin/sh -c. La solution qui a fonctionné pour moi consiste à analyser la commande sous la forme d'un tableau JSON de chaîne, par exemple.
cmd ["hello"]
et inspecter à nouveau l'image:
"Entrypoint": [
"hello"
]
Cela supprime la dépendance à l'égard de/bin/sh, l'application de menu fixe peut maintenant exécuter le fichier binaire. Exemple:
FROM scratch
# Environmental variables
# Copy files
ADD . /
# Home dir
WORKDIR /bin
EXPOSE 8083
ENTRYPOINT ["hospitalms"]
J'espère que cela aidera quelqu'un à l'avenir.
Mentionner explicitement la version d'ubuntu dans le fichier de menu fixe que vous essayez d'exécuter,
FROM ubuntu:14.04
Ne pas utiliser comme FROM ubuntu:Latest
. Ce problème résolu ci-dessus "Impossible de démarrer le conteneur: stat/bin/sh: aucun fichier ou répertoire de ce type"
Vous n'avez pas de shell dans/bin/sh? Avez-vous essayé docker run -it pensu/busybox /usr/bin/sh
?