gpt4 book ai didi

Docker 绑定(bind)挂载在 AWS EC2 实例中未按预期工作

转载 作者:行者123 更新时间:2023-12-02 18:26:56 26 4
gpt4 key购买 nike

我创建了以下 Dockerfile运行 spring-boot 应用程序:myapp在 EC2 实例中。

# Use an official java runtime as a parent image
FROM openjdk:8-jre-alpine


# Add a user to run our application so that it doesn't need to run as root
RUN adduser -D -s /bin/sh myapp


# Set the current working directory to /home/myapp
WORKDIR /home/myapp

#copy the app to be deployed in the container
ADD target/myapp.jar myapp.jar

#create a file entrypoint-dos.sh and put the project entrypoint.sh content in it
ADD entrypoint.sh entrypoint-dos.sh

#Get rid of windows characters and put the result in a new entrypoint.sh in the container
RUN sed -e 's/\r$//' entrypoint-dos.sh > entrypoint.sh

#set the file as an executable and set myapp as the owner
RUN chmod 755 entrypoint.sh && chown myapp:myapp entrypoint.sh

#set the user to use when running the image to myapp
USER myapp

# Make port 9010 available to the world outside this container
EXPOSE 9010


ENTRYPOINT ["./entrypoint.sh"]

因为我需要访问 myapp来自 EC2 主机的日志,我想将一个文件夹绑定(bind)到位于“myapp”容器中的日志文件夹中: /home/myapp/logs
这是我用来在 ec2 控制台中运行镜像的命令:
docker run -p 8090:9010 --name myapp myapp:latest -v home/ec2-user/myapp:/home/myapp/logs

容器启动时没有任何问题,但未实现挂载,如以下 docker inspect 中所述提炼:
...      
"Mounts": [],
...

我尝试了以下操作,但结果相同:
  • --mount type=bind而不是 -v
  • 使用卷而不是绑定(bind)挂载
  • 我什至尝试过--privileged选项
  • 在 Dockerfile 中:我尝试使用 USER root而不是 myapp

  • 我相信,这与 ec2 机器无关,而与我的容器无关。由于在同一主机上运行具有绑定(bind)挂载的其他容器就像一个魅力。

    我很确定我搞砸了我的 Dockerfile。

    但是我在那个 Dockerfile 中做错了什么?

    或者

    我错过了什么?

    这里有 entrypoint.sh如果需要的话:
       #!/bin/sh
    echo "The app is starting ..."
    exec java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active=${SPRING_ACTIVE_PROFILES} "${HOME}/myapp.jar" "$@"

    最佳答案

    我认为问题可能是命令行上选项的顺序。 Docker 期望最后两个参数是图像 id/name 和(可选)一个命令/args 作为 pid 1 运行。

    https://docs.docker.com/engine/reference/run/

    The basic docker run command takes this form: $ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]



    在镜像名称 (myall:latest) 之后有挂载选项(在您提供的示例中为 -v)。我不确定,但也许 -v ...被解释为要传递给入口点脚本的参数(被忽略)和 docker run不被视为安装选项。

    此外,这里的挂载源 (home/ec2-user/myapp) 不是以前导正斜杠 (/) 开头,我相信这将使其相对于 docker run 的位置。命令从执行。您应该确保源路径以正斜杠开头(即/home/ec2-user/myapp),以便确保它始终挂载您期望的目录。 IE。 -v /home/ec2-user...
    你试过这个顺序:
    docker run -p 8090:9010 --name myapp -v /home/ec2-user/myapp:/home/myapp/logs myapp:latest

    关于Docker 绑定(bind)挂载在 AWS EC2 实例中未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958190/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com