简体   繁体   中英

docker-compose inside Alpine container

I'm attempting to bundle my app (code, Dockerfiles and a docker-compose script) together inside a single image for easy deployment (entrypoint will just docker-compose up ). My Dockerfile for this top level app image looks like so

FROM alpine:latest
COPY . /app
RUN apk update && apk add --no-cache docker py-pip openrc && pip install docker-compose

When I run this image, it seems that dockerd hasn't started, being absent from top results; docker ps reports "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? ". If however I do service docker start , this returns " * WARNING: docker is already starting". Is there anything special I need to do to get Docker working side of an Alpine container?

If you can't or don't want to inherit from docker:dind as mentioned in grapes answer there is an option to use alpine as a base image and install Docker CLI and Docker Compose.

To keep image small some dependencies can be deleted after Docker Compose installation:

FROM alpine:3.11

RUN apk update && \
    apk add --no-cache docker-cli python3 && \
    apk add --no-cache --virtual .docker-compose-deps python3-dev libffi-dev openssl-dev gcc libc-dev make && \
    pip3 install docker-compose && \
    apk del .docker-compose-deps

This image doesn't contain Docker Engine and Docker-in-Dcoker approach has to be used by mounting /var/run/docker.sock from the host

docker run -v /var/run/docker.sock:/var/run/docker.sock <image name>

Docker consists of docker daemon, who runs all services, and CLI, used to interact with daemon (ok, there are lots of other parts, but these are most important). Installing docker-compose does not install daemon, regardless of what message you are getting from service command.

To use docker inside container, you have to use docker-in-docker image. It is called docker:dind . Inherit from it (instead of alpine ) and enjoy.

But before read this article , which explains why it is not a great idea and what are other ways to use docker inside container (tip: you can call host's docker daemon from inside container with just mounting /var/run/docker.sock:/var/run/docker.sock socket).

You can run this to get docker-compose

apk update && apk add --no-cache --virtual docker-cli python3 .docker-compose-deps python3-dev libffi-dev openssl-dev gcc libc-dev make python3 py3-pip py-pip curl libffi-dev openssl-dev gcc libc-dev rust cargo make

pip install docker-compose

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM