일부 bash 스크립트에 대한 런타임 환경을 구축하는 Dockerfile이 있는데 현재 다음과 같습니다.
FROM debian:buster-slim
RUN apt-get update
RUN apt-get upgrade
RUN apt-get install curl -y
# Install MySQL tools
RUN apt-get install default-mysql-client -y
# Install AWS CLI v2
RUN apt-get install awscli -y
# Install Docker
RUN curl -fsSL https://get.docker.com -o get-docker.sh
RUN chmod +x ./get-docker.sh
RUN ./get-docker.sh
RUN rm get-docker.sh
# Copy jobs into container
WORKDIR /
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
스크립트 docker-entrypoint.sh
에는 다음이 포함됩니다.
#!/bin/bash
docker --version
/jobs/$1/run.sh
마지막으로 실행 중인 작업( run.sh
궁극적으로 실행되는 스크립트 docker-entrypoint.sh
)은 다음과 같습니다.
#!/bin/bash
docker --version
docker --version
내부의 첫 번째 실행은 docker-entrypoint.sh
예상대로 작동하고 Docker 버전을 출력합니다. 두 번째 실행이 run.sh
다음 메시지와 함께 실행되지 않습니다.
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
어떤 이유로 내부 스크립트는 docker 데몬에 액세스할 수 없는 것 같지만 외부 스크립트는 액세스할 수 있습니다.
./docker-entrypoint.sh [job-name]
흥미롭게도 실제로 Docker 컨테이너 내부가 아닌 로컬로 실행 하면 두 실행 모두에서 예상되는 출력을 얻습니다.
왜 이런 일이 발생하는지 설명하고 해결하는 데 도움을 줄 수 있는 사람이 있나요?
답변1
Docker 소켓은 실행 중인 컨테이너 내에서 자동으로 사용할 수 없습니다. 명시적으로 설치해야 합니다.
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
(적절한 접미사 포함,예를 들어 :z
SELinux가 활성화된 경우).
docker --version
소켓이 없으면 작동하지 않습니다.필요Docker 소켓 /var/run/docker.sock
이 없으면 데몬에 연결하지 않고 도구 버전을 반환합니다. 컨테이너의 스크립트는 다른 docker
명령을 실행해야 합니다.